Abfragen migrieren
Migrieren Sie Ihre Sigma-Abfragen von Presto zu Trino.
Wir haben die Sigma Abfrageinfrastruktur von Presto v334 auf Trino v414 aktualisiert. Die meisten Abfragen laufen als Ergebnis des Upgrades schneller, doch einige Abfragen können unerwartet Fehler aufweisen oder Ergebnisse in verschiedenen Formaten liefern.
Verwenden Sie die folgenden Vorschläge, um Ihre Sigma-Abfragen mit Trino v414 kompatibel zu machen.
Ungültige Zeitzonen
Die Zeitzone AMERICA/NEW_
ist in Trino v414 nicht mehr gültig.
-- FAILED: Presto error: NOT_SUPPORTED: Time zone not supported: AMERICA/NEW_YORK select date_format( c.created AT TIME ZONE 'AMERICA/NEW_YORK', '%Y-%m-%d' ) from charges c
Verwenden Sie stattdessen America/New_
.
-- VALID select date_format( c.created AT TIME ZONE 'America/New_York', '%Y-%m-%d' ) from charges c
Ungültige Spaltenreferenzen
Trino v414 erlaubt es nicht, auf Spaltennamen mit ihrer Ursprungsunterabfrage oder ihrem bedingten Tabellenausdruck (CTE) außerhalb des Bereichs zu verweisen.
-- FAILED: Presto error: COLUMN_NOT_FOUND: Column 'c.created' cannot be resolved select c.created from (select created from charges c)
Die vorherige Abfrage ist ungültig, da die Unterabfrage c
nicht auf der obersten Ebene definiert ist, sondern außerhalb ihres definierten Bereichs auf der obersten Ebene referenziert wird.
-- VALID select created from (select created from charges c)
-- VALID select c.created from (select created from charges) c
Verweisen Sie entweder auf die Spalte ohne die Unterabfrage oder definieren Sie die Unterabfrage auf der gleichen Ebene wie ihre Referenz.
Wissenschaftliche Notation
Das Umwandeln eines double in einen varchar in Trino v414 liefert Ergebnisse in wissenschaftlicher Notation statt in Dezimalschreibweise wie in Presto v334.
-- RESULT: 1.0E2 select cast(100.0 as varchar)
Um diese Dezimalnotation beizubehalten, wandeln Sie das Double in decimal und dann in varchar um.
-- RESULT: 100.0 select cast(cast(100.0 as decimal(18,1)) as varchar)
Zeitstempelfunktionen
FROM_UNIXTIME
Trino v414 geht davon aus, dass der Ergebniszeitstempel in UTC ist, und fügt bei Verwendung von from_unixtime ein abschließendes „UTC“ hinzu.
-- Trino v414 RESULT: 1970-01-01 00:00:00.000 UTC -- Presto v334 RESULT: 1970-01-01 00:00:00 +0000 select from_unixtime(0)
Um das abschließende „UTC“ zu entfernen, wandeln Sie das Ergebnis von from_
als timestamp
um.
-- RESULT: 1970-01-01 00:00:00 +0000 select cast(from_unixtime(0) as timestamp)
TO_ISO8601
In Presto v334 fügt to_iso8601 einem Zeitstempel ohne Zeitzone ein abschließendes Zulu-Zeitzonen-Suffix („Z“) hinzu, während Trino v414 dies nicht tut.
-- Presto v334 RESULT: 2024-04-01T00:00:00.000Z -- Trino v414 RESULT: 2024-04-01T00:00:00 select to_iso8601(timestamp '2024-04-01')
Um sicherzustellen, dass das hintere Zulu-Zeitzonensuffix hinzugefügt wird, interpretieren Sie den Zeitstempel in UTC, bevor Sie to_
aufrufen.
-- RESULT: 2024-04-01T00:00:00Z select to_iso8601(timestamp '2024-04-01' at time zone 'UTC')
Abfrage non-deterministisch
Wenn Ihre Abfrage unabhängig von der Sigma-Version nicht deterministisch ist, können verschiedene Ausführungen zu unterschiedlichen Ergebnissen führen. Hier sind häufige Abfragemuster, die zu nicht-deterministischen Ergebnissen führen können.
Top-K-Abfragen
-- POTENTIALLY NON-DETERMINISTIC select * from charges order by created DESC limit 10
Wenn die 10. und 11. der zuletzt erstellten Gebühren zur gleichen Zeit erstellt wurden, kann nicht garantiert werden, welche Gebühr zurückerstattet wird. Achten Sie darauf, auch nach einer eindeutigen Kennung für deterministische Ergebnisse zu sortieren.
-- DETERMINISTIC select * from charges order by created DESC, id limit 10
Fensteraggregation
-- POTENTIALLY NON-DETERMINISTIC select * from ( select c.*, row_number() over ( partition by c.customer_id order by c.amount DESC ) as row_rank from charges c ) where row_rank = 1
Die obige Abfrage gibt die höchste Gebühr für jeden Kunden/jede Kundin mit row_number zurück. Siehe Fensterfunktionen. Wenn ein Kunde/eine Kundin mehrere Abbuchungen mit demselben Höchstbetrag hat, kann nicht garantiert werden, welche Abbuchung zurückgegeben wird.
Sortieren nach einer eindeutigen Kennung in der Fensterreihenfolge für deterministische Ergebnisse.
-- DETERMINISTIC select * from ( select c.*, row_number() over ( partition by c.customer_id order by c.amount DESC, c.created DESC, c.id ) as row_rank from charges c ) where row_rank = 1