Partage via


Interroger des types imbriqués dans des fichiers Parquet et JSON à l’aide d’un pool SQL serverless dans Azure Synapse Analytics

Cet article explique comment écrire une requête à l’aide d’un pool SQL serverless dans Azure Synapse Analytics. La requête va lire des types imbriqués Parquet. Les types imbriqués sont des structures complexes qui représentent des objets ou des tableaux. Les types imbriqués peuvent être stockés dans :

  • Parquet où vous pouvez avoir plusieurs colonnes complexes qui contiennent des tableaux et des objets.
  • Fichiers JSON hiérarchiques où vous pouvez lire un document JSON complexe en tant que colonne unique.
  • Collections Azure Cosmos DB (actuellement en préversion publique contrôlée) où chaque document peut contenir des propriétés imbriquées complexes.

Le pool SQL serverless met en forme tous les types imbriqués en tant qu’objets et tableaux JSON. Vous pouvez extraire ou modifier des objets complexes à l’aide de fonctions JSON ou analyser des données JSON à l’aide de la fonction OPENJSON.

Voici un exemple de requête qui extrait des valeurs scalaires et d’objets du fichier de jeu de données JSON COVID-19 Open Research Dataset qui contient des objets imbriqués :

SELECT
    title = JSON_VALUE(doc, '$.metadata.title'),
    first_author = JSON_QUERY(doc, '$.metadata.authors[0]'),
    first_author_name = JSON_VALUE(doc, '$.metadata.authors[0].first'),
    complex_object = doc
FROM
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/covid19temp/comm_use_subset/pdf_json/000b7d1517ceebb34e1e3e817695b6de03e2fa78.json',
        FORMAT='CSV', FIELDTERMINATOR ='0x0b', FIELDQUOTE = '0x0b', ROWTERMINATOR = '0x0b'
    )
    WITH ( doc varchar(MAX) ) AS docs;

La fonction JSON_VALUE retourne une valeur scalaire à partir du champ dans le chemin d’accès spécifié. La fonction JSON_QUERY retourne un objet au format JSON à partir du champ dans le chemin d’accès spécifié.

Important

Cet exemple utilise un fichier à partir du jeu de données COVID-19 Open Research Dataset. Consultez la licence et la structure des données ici.

Prérequis

La première étape consiste à créer une base de données dans laquelle la source des données sera créée. Ensuite, vous allez initialiser les objets en exécutant un script d’installation sur la base de données. Le script crée les sources de données, les informations d'identification étendues à la base de données et les formats de fichiers externes utilisés dans les exemples.

Projeter des données imbriquées ou répétées

Un fichier Parquet peut avoir plusieurs colonnes avec des types complexes. Les valeurs de ces colonnes sont mises en forme en tant que texte JSON et retournées en tant que colonnes VARCHAR. La requête suivante lit le fichier structExample.parquet et montre comment lire les valeurs des colonnes imbriquées :

SELECT
    DateStruct, TimeStruct, TimestampStruct, DecimalStruct, FloatStruct
FROM
    OPENROWSET(
        BULK 'parquet/nested/structExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    )
    WITH (
        DateStruct VARCHAR(8000),
        TimeStruct VARCHAR(8000),
        TimestampStruct VARCHAR(8000),
        DecimalStruct VARCHAR(8000),
        FloatStruct VARCHAR(8000)
    ) AS [r];

Cette requête donne le résultat suivant. Le contenu de chaque objet imbriqué est retourné sous forme de texte JSON.

DateStruct TimeStruct TimestampStruct DecimalStruct FloatStruct
{"Date":"2009-04-25"} {"Time":"20:51:54.3598000"} {"Timestamp":"5501-04-08 12:13:57.4821000"} {"Decimal":11143412.25350} {"Float":0.5}
{"Date":"1916-04-29"} {"Time":"00:16:04.6778000"} {"Timestamp":"1990-06-30 20:50:52.6828000"} {"Decimal":1963545.62800} {"Float":-2.125}

La requête suivante lit le fichier justSimpleArray.parquet. Il projette toutes les colonnes du fichier Parquet, y compris les données imbriquées et répétées.

SELECT
    SimpleArray
FROM
    OPENROWSET(
        BULK 'parquet/nested/justSimpleArray.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS [r];

Cette requête retournera le résultat suivant :

SimpleArray
[11,12,13]
[21,22,23]

Lire les propriétés à partir des colonnes d’objets imbriqués

La fonction JSON_VALUE vous permet de retourner des valeurs à partir de colonnes au format texte JSON :

SELECT
    title = JSON_VALUE(complex_column, '$.metadata.title'),
    first_author_name = JSON_VALUE(complex_column, '$.metadata.authors[0].first'),
    body_text = JSON_VALUE(complex_column, '$.body_text.text'),
    complex_column
FROM
    OPENROWSET( BULK 'https://azureopendatastorage.blob.core.windows.net/covid19temp/comm_use_subset/pdf_json/000b7d1517ceebb34e1e3e817695b6de03e2fa78.json',
                FORMAT='CSV', FIELDTERMINATOR ='0x0b', FIELDQUOTE = '0x0b', ROWTERMINATOR = '0x0b' ) WITH ( complex_column varchar(MAX) ) AS docs;

Le résultat est présenté dans le tableau suivant :

title first_author_name body_text complex_column
Informations supplémentaires Un éco-épidémiolo... Julien - Figure S1 : Phylogénie de... { "paper_id": "000b7d1517ceebb34e1e3e817695b6de03e2fa78", "metadata": { "title": "Supplementary Information An eco-epidemiological study of Morbilli-related paramyxovirus infection in Madagascar bats reveals host-switching as the dominant macro-evolutionary mechanism", "authors": [ { "first": "Julien"

Contrairement aux fichiers JSON, qui, dans la plupart des cas, retournent une seule colonne contenant un objet JSON complexe, les fichiers Parquet peuvent avoir plusieurs colonnes complexes. Vous pouvez lire les propriétés de la colonne imbriquée à l’aide de la fonction JSON_VALUE sur chaque colonne. OPENROWSET vous permet de spécifier directement les chemins d’accès des propriétés imbriquées dans une clause WITH. Vous pouvez définir les chemins en tant que nom d’une colonne, ou vous pouvez ajouter une expression JSON après le type de colonne.

La requête suivante lit le fichier structExample.parquet et montre comment exposer les éléments d’une colonne imbriquée. Il y a deux façons de référencer une valeur imbriquée :

  • En spécifiant l’expression de chemin de valeur imbriquée après la spécification de type.
  • En mettant en forme du nom de colonne en tant que chemin imbriqué à l’aide de «.» pour référencer les champs.
SELECT
    *
FROM
    OPENROWSET(
        BULK 'parquet/nested/structExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    )
    WITH (
        [DateValue] DATE '$.DateStruct.Date',
        [TimeStruct.Time] TIME,
        [TimestampStruct.Timestamp] DATETIME2,
        DecimalValue DECIMAL(18, 5) '$.DecimalStruct.Decimal',
        [FloatStruct.Float] FLOAT
    ) AS [r];

Accéder aux éléments à partir de colonnes répétées

La requête suivante lit le fichier justSimpleArray.parquet et utilise JSON_VALUE pour récupérer un élément scalaire à partir d’une colonne répétée, comme un tableau ou une carte :

SELECT
    *,
    JSON_VALUE(SimpleArray, '$[0]') AS FirstElement,
    JSON_VALUE(SimpleArray, '$[1]') AS SecondElement,
    JSON_VALUE(SimpleArray, '$[2]') AS ThirdElement
FROM
    OPENROWSET(
        BULK 'parquet/nested/justSimpleArray.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS [r];

Voici le résultat :

SimpleArray FirstElement SecondElement ThirdElement
[11,12,13] 11 12 13
[21,22,23] 21 22 23

Accéder à des sous-objets à partir de colonnes complexes

La requête suivante lit le fichier mapExample.parquet et utilise JSON_QUERY pour récupérer un élément non scalaire à partir d’une colonne répétée, telle qu’un tableau ou une carte :

SELECT
    MapOfPersons,
    JSON_QUERY(MapOfPersons, '$."John Doe"') AS [John]
FROM
    OPENROWSET(
        BULK 'parquet/nested/mapExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS [r];

Vous pouvez également référencer explicitement les colonnes que vous souhaitez renvoyer dans une clause WITH :

SELECT DocId,
    MapOfPersons,
    JSON_QUERY(MapOfPersons, '$."John Doe"') AS [John]
FROM
    OPENROWSET(
        BULK 'parquet/nested/mapExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) 
    WITH (DocId bigint, MapOfPersons VARCHAR(max)) AS [r];

La structure MapOfPersons est retournée en tant que colonne VARCHAR et mise en forme en tant que chaîne JSON.

Projeter des valeurs à partir de colonnes répétées

Si vous avez un tableau de valeurs scalaires (par exemple [1,2,3]) dans certaines colonnes, vous pouvez facilement les développer et les joindre à la ligne principale à l’aide de ce script :

SELECT
    SimpleArray, Element
FROM
    OPENROWSET(
        BULK 'parquet/nested/justSimpleArray.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS arrays
    CROSS APPLY OPENJSON (SimpleArray) WITH (Element int '$') as array_values

Étapes suivantes

L’article suivant vous indiquera comment interroger des fichiers JSON.