Migrer des requêtes
Migrez vos requêtes Sigma de Presto vers Trino.
Nous avons mis à jour l’infrastructure de requêtes de Sigma de Presto v334 vers Trino v414. La plupart des requêtes s’exécutent plus rapidement suite à la mise à jour, mais quelques requêtes peuvent provoquer des erreurs inattendues ou produire des résultats dans des formats différents.
Utilisez les suggestions suivantes pour rendre vos requêtes Sigma compatibles avec Trino v414.
Fuseaux horaires non valides
Le fuseau horaire AMERICA/NEW_
n’est plus valide dans Trino v414.
-- 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
Utilisez plutôt America/New_
.
-- VALID select date_format( c.created AT TIME ZONE 'America/New_York', '%Y-%m-%d' ) from charges c
Références de colonnes non valides
Trino v414 ne permet pas de faire référence à des noms de colonnes dont la sous-requête d’origine ou l’expression de table conditionnelle (CTE) est en dehors du champ défini.
-- FAILED: Presto error: COLUMN_NOT_FOUND: Column 'c.created' cannot be resolved select c.created from (select created from charges c)
La requête précédente est invalide, car la sous-requête c
n’est pas définie au niveau supérieur, mais est référencée au niveau supérieur, en dehors du champ défini.
-- VALID select created from (select created from charges c)
-- VALID select c.created from (select created from charges) c
Faites référence à la colonne sans la sous-requête, ou définissez la sous-requête au même niveau que sa référence.
Notation scientifique
La conversion d’une valeur double en valeur varchar dans Trino v414 produit des résultats en notation scientifique au lieu de la notation décimale, comme dans Presto v334.
-- RESULT: 1.0E2 select cast(100.0 as varchar)
Pour conserver cette notation décimale, la valeur double est convertie en décimale, puis en valeur varchar.
-- RESULT: 100.0 select cast(cast(100.0 as decimal(18,1)) as varchar)
Fonctions d’horodatage
FROM_UNIXTIME
Trino v414 suppose que l’horodatage du résultat est en UTC et ajoute la mention « UTC » après la valeur lors de l’utilisation de from_unixtime.
-- 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)
Pour supprimer la mention « UTC », convertissez le résultat de from_
en timestamp
.
-- RESULT: 1970-01-01 00:00:00 +0000 select cast(from_unixtime(0) as timestamp)
TO_ISO8601
Dans Presto v334, to_iso8601 ajoute un suffixe de fuseau horaire zoulou (« Z ») à un horodatage sans fuseau horaire, contrairement à Trino v414.
-- Presto v334 RESULT: 2024-04-01T00:00:00.000Z -- Trino v414 RESULT: 2024-04-01T00:00:00 select to_iso8601(timestamp '2024-04-01')
Pour s’assurer que le suffixe du fuseau horaire zoulou est ajouté, interprétez l’horodatage en UTC avant d’appeler to_
.
-- RESULT: 2024-04-01T00:00:00Z select to_iso8601(timestamp '2024-04-01' at time zone 'UTC')
Non-déterminisme des requêtes
Si votre requête est non déterministe, quelle que soit la version de Sigma, différentes exécutions peuvent donner des résultats différents. Voici quelques exemples de requêtes qui peuvent conduire à des résultats non déterministes.
Requêtes Top-K
-- POTENTIALLY NON-DETERMINISTIC select * from charges order by created DESC limit 10
Si les 10e et 11e paiements les plus récents ont été créés en même temps, il n’y a aucune garantie quant au paiement qui sera renvoyé. Veillez également à effectuer un tri en fonction de l’identifiant unique pour obtenir des résultats déterministes.
-- DETERMINISTIC select * from charges order by created DESC, id limit 10
Agrégation de fenêtres
-- 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
La requête ci-dessus renvoie le montant le plus élevé pour chaque client en utilisant le row_number. Consultez la page Fonctionnalités de la fenêtre. Si un client présente plusieurs paiements avec le même montant maximum, il n’y a aucune garantie quant au paiement qui sera renvoyé.
Effectuez un tri en fonction de l’identifiant unique dans l’ordre de la fenêtre pour obtenir des résultats déterministes.
-- 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