Datum-Vergleich im Hive
Arbeite ich mit Bienen und ich habe eine Tabelle wie folgt strukturiert:
CREATE TABLE t1 (
id INT,
created TIMESTAMP,
some_value BIGINT
);
Muss ich nach jeder Zeile in t1
das ist weniger als 180 Tage alt. Die folgende Abfrage liefert keine Datensätze, obwohl es Daten in der Tabelle vorhanden, die Spiele der Suche nach Prädikat.
select *
from t1
where created > date_sub(from_unixtime(unix_timestamp()), 180);
Was ist der geeignete Weg, um führen Sie ein Termin-Vergleich in Hive?
InformationsquelleAutor Jeremiah Peschka | 2012-12-28
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa:
Datum der Mathematik ist in der Regel einfachsten, wenn Sie können, tun Sie es einfach mit dem aktuellen timestamp-Werte.
Oder wollen Sie es nur abschneiden auf ganze Tage? Dann denke ich, das problem ist mit, wie Sie die Umwandlung hin und her zwischen ints und strings. Versuchen:
Wandern durch die einzelnen UDF:
unix_timestamp()
gibt ein int: aktuelle Zeit in Sekunden seit Epochefrom_unixtime(,'yyyy-MM-dd')
konvertiert eine Zeichenfolge mit dem angegebenen format, z.B. '2012-12-28'date_sub(,180)
subtrahiert von 180 Tagen ab, dass die Zeichenfolge und gibt eine neue Zeichenfolge in demselben format.unix_timestamp(,'yyyy-MM-dd')
wandelt diese Zeichenfolge wieder in ein intWenn das alles zu haarig ist, können Sie immer schreiben Sie eine UDF, es selbst zu tun.
TIMESTAMP
/STRING
und einINT
Arbeit in diesem Fall?Folgenden die
TIMESTAMP
/STRING
zuINT
vergleichen Sie funktioniert. Vielen Dank für die Informationen, es vereinfacht die Abfrage gut.InformationsquelleAutor Joe K
Alternativ können Sie auch datediff. Dann die where-Klausel wäre
im Fall von String-timestamp (jdbc-format) :
im Falle der Unix-Epoche Zeit:
InformationsquelleAutor Lorand Bendig
Ich denke, vielleicht ist es ein Hive-bug Umgang mit der timestamp geben. Ich habe versucht, verwenden Sie es vor kurzem und immer falsche Ergebnisse.
Wenn ich ändern Sie Ihre schema für die Verwendung eines string statt timestamp, und liefern Werte in der
format, dann die select-Abfrage für mich gearbeitet.
Laut der Dokumentation, die Struktur sollte in der Lage sein, zu konvertieren, eine BIGINT-Vertretung Epoche Sekunden, um einen Zeitstempel, und dass alle bestehenden datetime-UDFs arbeiten mit dem Datentyp timestamp.
mit dieser einfachen Abfrage:
Ich würde erwarten, dass beide Felder die gleiche, aber ich bekomme die Meldung:
Ich bin da anderer Seltsamkeit sowie.
Dank plus hat Abhilfe... ich Suche für meinen anderen timestamp-Probleme als gut.
InformationsquelleAutor libjack
TIMESTAMP ist in Millisekunden
unix_timestamp ist in Sekunden
Sie multiplizieren die Rechte Seite von 1000.
InformationsquelleAutor user1089933
Nach Durchsicht dieses und verweist auf Datum Differenz weniger als 15 Minuten in Hive ich kam mit einer Lösung. Während ich bin nicht sicher, warum Hive nicht den Vergleich effektiv auf Daten, die als strings (sollten Sie Sortieren und vergleichen lexikographisch), die folgende Lösung funktioniert:
InformationsquelleAutor Jeremiah Peschka