2016-07-24 6 views
1

Wenn LAST oder FIRST in einer Abfrage verwendet wird, die mehrere Tabellen ausführt, sind die zurückgegebenen Ergebnisse nicht konsistent. Wenn Sie dieselbe Abfrage erneut ausführen, werden jedes Mal andere Ergebnisse zurückgegeben.Die Verwendung von FIRST oder LAST over partitionierten Tabellen gibt inkonsistente Werte zurück

Die zurückgegebenen Werte stimmen jedoch mit den korrekten Werten LAST und FIRST von eins der Tabellen in der Abfrage überein. Die jeweils verwendete Tabelle scheint jedoch zufällig ausgewählt zu sein.

Zum Beispiel die Abfrage unter:

SELECT 
    FIRST(timestamp) as first_ts, 
FROM TABLE_DATE_RANGE([some_table]_, timestamp('2016-07-21'), timestamp('2016-07-22')) 

zurückkehren wird:

first_ts 
2016-07-22 07:35:30 UTC 

das erste Mal ausgeführt wird, und:

first_ts 
2016-07-21 23:16:26 UTC 

das nächste Mal ausgeführt wird. Und so weiter.

Das erwartete Ergebnis ist 2016-07-21 23:16:26. Der Wert 2016-07-22 07:35:30 UTC ist jedoch der erste Zeitstempel der Tabelle [some_table]_20160722. Daher glaube ich, dass BigQuery es nicht ermöglicht, die Tabellen bei der Abfrage zwischen Tabellen zu sortieren. Als Ergebnis werden FIRST und LAST unzuverlässig, da die Reihenfolge der Tabellen nicht bekannt ist. Beachten Sie, dass MAX und MIN tun gut über Tabellen arbeiten.

Dies gilt nicht nur für die Verwendung der Legacy-SQL, sondern auch für die Verwendung der neuen SQL und der Funktionen FIRST_VALUE und LAST_VALUE (da FIRST und LAST nicht mehr unterstützt werden. Wahrscheinlich verwandt?) Siehe Beispiel unten mit neuer SQL.

SELECT 
    FIRST_VALUE(timestamp) OVER (ORDER BY event_sequence ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_ts, 
FROM `some_table_*` 
WHERE _TABLE_SUFFIX BETWEEN '20160721' AND '20160722' 

Zusätzlich wird ein ähnliches Verhalten (und dies könnte ein anderes Thema in Betracht gezogen wird) wird beobachtet, wenn eine einzige Tabelle Abfrage wo Daten mehrfach auf sie angehängt wurden. Die Ergebnisse von FIRST und LAST werden inkonsistent. Jede geladene Teilmenge von Daten verhält sich wie eine Partition.

Das scheint mir wie ein Fehler, es sei denn, jemand kennt einen Weg, dies zu tun. Google Bigquery Team, wir lieben Ihr Produkt. Aber könnten Sie das bitte reparieren? Wir können FIRST- und LAST-Aggregationen nicht zuverlässig verwenden, und das ist eine große Sache für uns. Vielen Dank!

+0

Wichtig auf SO, können Sie, indem Sie das Häkchen auf der linken Seite der entsandten Antwort akzeptierte Antwort markiert, unter dem Wählen. Siehe http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235, warum dies wichtig ist. Es gibt mehr ... Sie können überprüfen, was zu tun ist, wenn jemand Ihre Frage beantwortet - http://stackoverflow.com/help/someone-answers. –

Antwort

1

Wir nicht erste und letzte Aggregationen auf zuverlässige Art und Weise nutzen können, und das ist eine große Sache für uns

Ich glaube nicht, dass es sich hier um einen Fehler ist!

Aus Dokumentation:

FIRST (ausdr)
Gibt den ersten Wert in der Folge im Rahmen der Funktion.

Tabelle selbst ist nicht als geordnete Sequenz betrachtet.BigQuery garantiert nicht die Reihenfolge der Ausgabezeilen, es sei denn, Sie geben einen Hinweis - zum Beispiel ORDER BY

Also in Ihrem Beispiel - sollten Sie unten verwenden. Dies gibt Ihnen das erwartete Ergebnis in zuverlässiger Weise!

SELECT 
    FIRST(timestamp) AS first_ts 
FROM (
    SELECT * 
    FROM TABLE_DATE_RANGE([some_table]_, TIMESTAMP('2016-07-21'), TIMESTAMP('2016-07-22')) 
    ORDER BY timestamp 
) 

Hinweis: natürlich MAX und MIN funktionieren, wie sie kümmern sich nicht die Ordnung

+0

Richtig, macht Sinn. Vielen Dank. Es ist gut zu wissen, dass 'Tabelle an sich nicht als eine geordnete Sequenz angesehen wird '. Das ist die Lösung, die wir im Moment verwenden, aber für die Menge der Daten, die wir abfragen müssen, bekommen wir eine "Ressourcenüberschreitung". –

+0

Es gibt immer einen Workaround! Präsentiere mehr Details und wir können vielleicht helfen: o) Ich empfehle dir, eine neue Frage zu diesem –

+0

Awesome zu stellen. Wird besorgt. Vielen Dank! –