hive-sql finden Sie die neuesten Datensatz
dem Tisch ist:
create table test (
id string,
name string,
age string,
modified string)
Daten wie diese:
id name age modifed
1 a 10 2011-11-11 11:11:11
1 a 11 2012-11-11 12:00:00
2 b 20 2012-12-10 10:11:12
2 b 20 2012-12-10 10:11:12
2 b 20 2012-12-12 10:11:12
2 b 20 2012-12-15 10:11:12
Ich möchte den aktuellen Datensatz(jede Spalten-id,name,Alter,modifiziert) group by id,wie die oben angeführten Daten,das richtige Ergebnis ist:
1 a 11 2012-11-11 12:00:00
2 b 20 2012-12-15 10:11:12
Ich dies so tun:
insert overwrite table t
select b.id, b.name, b.age, b.modified
from (
select id,max(modified) as modified
from test
group by id
) a
left outer join test b on (a.id=b.id and a.modified=b.modified);
Diese sql kann das richtige Ergebnis,aber bei der Masse von Daten,es läuft langsam.
**Gibt es eine Möglichkeit, dies zu tun, ohne left-outer-join? **
InformationsquelleAutor der Frage qiulp | 2012-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine fast nicht dokumentierte Funktion von Hive-SQL (ich fand es in einem Ihrer Jira-bug-reports), können Sie etwas tun, wie argmax() mit struct()s ist. Zum Beispiel, wenn Sie haben eine Tabelle wie:
Können Sie dies tun:
erhalten Sie das Ergebnis:
Ich denke, im Fall von Bindungen auf val (das erste struct element) wird wieder zum Vergleich auf die zweite Spalte. Ich habe auch noch nicht herausgefunden, ob es ein ordentlicher syntax für das abrufen der einzelnen Spalten wieder aus der resultierenden Struktur, die vielleicht named_struct irgendwie?
InformationsquelleAutor der Antwort patricksurry
Es ist eine relativ neue Funktion von Hive-SQL, analytische Funktionen und die over-Klausel. Dies sollte den job tun, ohne joins
Was hier Los ist, dass die Unterabfrage erzeugt eine neue Zeile mit einer zusätzlichen Spalte last_modified, die hat die neueste modified-Zeitstempel für die entsprechende person-id. (Ähnlich zu dem, was group by würde das tun), Der Schlüssel hier ist, dass die Unterabfrage bekommt Sie wieder eine Zeile pro Zeile in der ursprünglichen Tabelle, und klicken Sie filter aus.
Gibt es eine chance, dass auch die einfachere Lösung funktioniert:
Durch die Art und Weise, der gleiche code funktioniert in Impala, auch.
InformationsquelleAutor der Antwort Mateo
Geben diesem einen Versuch:
Fiddle hier.
Left-outer-join-Lösung hier.
Lassen Sie uns wissen, welches schneller läuft 🙂
InformationsquelleAutor der Antwort Mosty Mostacho
Nur etwas anderer Ansatz als das, was bereits beantwortet wurde in früheren Antwort.
Folgende Beispiel verwendet hive-windowing Funktion, um herauszufinden, den neuesten Datensatz, Lesen Sie mehr hier
Den geänderten string so konvertieren timestamp mit
unix_timestamp(modified,'yyyy-MM-dd hh:mm:ss')
dann anwenden, um durch auf-und Zeitstempel.InformationsquelleAutor der Antwort Rahul Sharma
versuchen, diese
InformationsquelleAutor der Antwort SRIRAM
Wenn u können, stellen Sie sicher, dass die Zeile, die geändert hat, max hat auch max Alter in der gleichen Zeile id gesetzt.
Versuchen
InformationsquelleAutor der Antwort pensz
Vermuten, dass der Daten ist wie folgt:
dann das Ergebnis der obigen Abfrage werden Ihnen - (beachten Sie bitte, wiederholt 2, b mit dem gleichen Datum, Zeit)
Diese Abfrage läuft eine zusätzliche Gruppe durch und ist weniger effizient, sondern Sie gibt das richtige Ergebnis -
dann das Ergebnis der obigen Abfrage werden Ihnen
Nun, wenn wir die Verbesserung der Abfrage ein wenig - dann statt der 3 MRs-es läuft nur eine Keping das Ergebnis dasselbe -
Beachten Sie, dass dieser langsamer wird, im Falle Ihrer Gruppe durch Feld produziert große Ergebnisse.
InformationsquelleAutor der Antwort user 923227
Können Sie das gewünschte Ergebnis ohne Verwendung der left-outer-join wie diesem:
select * from test where (id, modifiziert) in(select id, max(modifiziert) from test group by id)
http://sqlfiddle.com/#!2/bfbd5/42
InformationsquelleAutor der Antwort aditya