FLATTEN (Lakehouse v1)
Transforme des données JSON imbriquées en format tabulaire, où chaque élément ou champ est représenté par une ligne distincte.
Syntaxe SQL
Section intitulée « Syntaxe SQL »[LATERAL] FLATTEN ( INPUT => <expr> [ , PATH => <expr> ] [ , OUTER => TRUE | FALSE ] [ , RECURSIVE => TRUE | FALSE ] [ , MODE => 'OBJECT' | 'ARRAY' | 'BOTH' ] )| Paramètre / mot-clé | Description | Par défaut |
|---|---|---|
| INPUT | Indique les données JSON ou le tableau à aplatir. | - |
| PATH | Indique le chemin du tableau ou de l’objet à aplatir dans les données en entrée. | - |
| OUTER | Si la valeur est TRUE, les lignes sans résultat sont tout de même incluses dans la sortie, mais les valeurs des colonnes KEY, INDEX et VALUE de ces lignes sont définies sur NULL. | FALSE |
| RECURSIVE | Si la valeur est TRUE, la fonction continue d’aplatir les éléments imbriqués. | FALSE |
| MODE | Détermine si seuls les objets (‘OBJECT’), seuls les tableaux (‘ARRAY’) ou les deux (‘BOTH’) sont aplatis. | ‘BOTH’ |
| LATERAL | LATERAL est un mot-clé facultatif qui permet de référencer des colonnes définies à gauche du mot-clé LATERAL dans la clause FROM. LATERAL permet les références croisées entre les expressions de table précédentes et la fonction. | - |
Le tableau suivant décrit les colonnes de sortie de la fonction FLATTEN :
| Colonne | Description |
|---|---|
| SEQ | Un numéro de séquence unique associé à l’entrée. |
| KEY | Clé de la valeur développée. Si l’élément aplati ne contient pas de clé, elle est définie sur NULL. |
| PATH | Chemin de l’élément aplati. |
| INDEX | Si l’élément est un tableau, cette colonne contient son index ; sinon, elle est définie sur NULL. |
| VALUE | Valeur de l’élément aplati. |
| THIS | Cette colonne identifie l’élément en cours d’aplatissement. |
Exemples SQL
Section intitulée « Exemples SQL »Exemples SQL 1 : démonstration des paramètres PATH, OUTER, RECURSIVE et MODE
Section intitulée « Exemples SQL 1 : démonstration des paramètres PATH, OUTER, RECURSIVE et MODE »Cet exemple illustre le comportement de la fonction FLATTEN avec les paramètres PATH, OUTER, RECURSIVE et MODE.
SELECT *FROM FLATTEN ( INPUT => PARSE_JSON ( '{"name": "John", "languages": ["English", "Spanish", "French"], "address": {"city": "New York", "state": "NY"}}' ) );
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐│ seq │ key │ path │ index │ value │ this │├────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤│ 1 │ address │ address │ NULL │ {"city":"New York","state":"NY"} │ {"address":{"city":"New York","state":"NY"},"languages":["English","Spanish","French"],"name":"John"} ││ 1 │ languages │ languages │ NULL │ ["English","Spanish","French"] │ {"address":{"city":"New York","state":"NY"},"languages":["English","Spanish","French"],"name":"John"} ││ 1 │ name │ name │ NULL │ "John" │ {"address":{"city":"New York","state":"NY"},"languages":["English","Spanish","French"],"name":"John"} │└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
-- PATH helps in selecting elements at a specific path from the original JSON data.SELECT *FROM FLATTEN ( INPUT => PARSE_JSON ( '{"name": "John", "languages": ["English", "Spanish", "French"], "address": {"city": "New York", "state": "NY"}}' ), PATH => 'languages' );
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐│ seq │ key │ path │ index │ value │ this │├────────┼──────────────────┼──────────────────┼──────────────────┼───────────────────┼────────────────────────────────┤│ 1 │ NULL │ languages[0] │ 0 │ "English" │ ["English","Spanish","French"] ││ 1 │ NULL │ languages[1] │ 1 │ "Spanish" │ ["English","Spanish","French"] ││ 1 │ NULL │ languages[2] │ 2 │ "French" │ ["English","Spanish","French"] │└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
-- RECURSIVE enables recursive flattening of nested structures.SELECT *FROM FLATTEN ( INPUT => PARSE_JSON ( '{"name": "John", "languages": ["English", "Spanish", "French"], "address": {"city": "New York", "state": "NY"}}' ), RECURSIVE => TRUE );
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐│ seq │ key │ path │ index │ value │ this │├────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤│ 1 │ address │ address │ NULL │ {"city":"New York","state":"NY"} │ {"address":{"city":"New York","state":"NY"},"languages":["English","Spanish","French"],"name":"John"} ││ 1 │ city │ address.city │ NULL │ "New York" │ {"city":"New York","state":"NY"} ││ 1 │ state │ address.state │ NULL │ "NY" │ {"city":"New York","state":"NY"} ││ 1 │ languages │ languages │ NULL │ ["English","Spanish","French"] │ {"address":{"city":"New York","state":"NY"},"languages":["English","Spanish","French"],"name":"John"} ││ 1 │ NULL │ languages[0] │ 0 │ "English" │ ["English","Spanish","French"] ││ 1 │ NULL │ languages[1] │ 1 │ "Spanish" │ ["English","Spanish","French"] ││ 1 │ NULL │ languages[2] │ 2 │ "French" │ ["English","Spanish","French"] ││ 1 │ name │ name │ NULL │ "John" │ {"address":{"city":"New York","state":"NY"},"languages":["English","Spanish","French"],"name":"John"} │└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
-- MODE specifies whether only objects ('OBJECT'), only arrays ('ARRAY'), or both ('BOTH') should be flattened.-- In this example, MODE => 'ARRAY' is used, which means that only arrays within the JSON data will be flattened.SELECT *FROM FLATTEN ( INPUT => PARSE_JSON ( '{"name": "John", "languages": ["English", "Spanish", "French"], "address": {"city": "New York", "state": "NY"}}' ), MODE => 'ARRAY' );
---
-- OUTER determines the inclusion of zero-row expansions in the output.-- In this first example, OUTER => TRUE is used with an empty JSON array, which results in zero-row expansions.-- Rows are included in the output even when there are no values to flatten.SELECT *FROM FLATTEN (INPUT => PARSE_JSON ('[]'), OUTER => TRUE);
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────┐│ seq │ key │ path │ index │ value │ this │├────────┼──────────────────┼──────────────────┼──────────────────┼───────────────────┼───────────────────┤│ 1 │ NULL │ NULL │ NULL │ NULL │ NULL │└─────────────────────────────────────────────────────────────────────────────────────────────────────────┘
-- In this second example, OUTER is omitted, and the output shows how rows with zero results are not included when OUTER is not specified.SELECT *FROM FLATTEN (INPUT => PARSE_JSON ('[]'));Exemples SQL 2 : démonstration de LATERAL FLATTEN
Section intitulée « Exemples SQL 2 : démonstration de LATERAL FLATTEN »Cet exemple illustre le comportement de la fonction FLATTEN lorsqu’elle est utilisée avec le mot-clé LATERAL.
-- Create a table for Tim Hortons transactions with multiple itemsCREATE TABLE tim_hortons_transactions ( transaction_id INT, customer_id INT, items VARIANT);
-- Insert data for Tim Hortons transactions with multiple itemsINSERT INTO tim_hortons_transactions (transaction_id, customer_id, items)VALUES (101, 1, parse_json('[{"item":"coffee", "price":2.50}, {"item":"donut", "price":1.20}]')), (102, 2, parse_json('[{"item":"bagel", "price":1.80}, {"item":"muffin", "price":2.00}]')), (103, 3, parse_json('[{"item":"timbit_assortment", "price":5.00}]'));
-- Show Tim Hortons transactions with multiple items using LATERAL FLATTENSELECT t.transaction_id, t.customer_id, f.value:item::STRING AS purchased_item, f.value:price::FLOAT AS priceFROM tim_hortons_transactions t, LATERAL FLATTEN(input => t.items) f;
┌───────────────────────────────────────────────────────────────────────────┐│ transaction_id │ customer_id │ purchased_item │ price │├─────────────────┼─────────────────┼───────────────────┼───────────────────┤│ 101 │ 1 │ coffee │ 2.5 ││ 101 │ 1 │ donut │ 1.2 ││ 102 │ 2 │ bagel │ 1.8 ││ 102 │ 2 │ muffin │ 2 ││ 103 │ 3 │ timbit_assortment │ 5 │└───────────────────────────────────────────────────────────────────────────┘
-- Find maximum, minimum, and average prices of the purchased itemsSELECT MAX(f.value:price::FLOAT) AS max_price, MIN(f.value:price::FLOAT) AS min_price, AVG(f.value:price::FLOAT) AS avg_priceFROM tim_hortons_transactions t, LATERAL FLATTEN(input => t.items) f;
┌───────────────────────────────────────────────────────────┐│ max_price │ min_price │ avg_price │├───────────────────┼───────────────────┼───────────────────┤│ 5 │ 1.2 │ 2.5 │└───────────────────────────────────────────────────────────┘