Beágyazott típusok lekérdezése Parquet- és JSON-fájlokban kiszolgáló nélküli SQL-készlet használatával az Azure Synapse Analyticsben

Ebből a cikkből megtudhatja, hogyan írhat lekérdezést kiszolgáló nélküli SQL-készlet használatával az Azure Synapse Analyticsben. A lekérdezés felolvassa a Parquet beágyazott típusait. A beágyazott típusok olyan összetett struktúrák, amelyek objektumokat vagy tömböket jelölnek. A beágyazott típusok a következő helyen tárolhatók:

  • Parquet, ahol több összetett oszlop is lehet, amelyek tömböket és objektumokat tartalmaznak.
  • Hierarchikus JSON-fájlok, ahol egy összetett JSON-dokumentumot olvashat egyetlen oszlopként.
  • Azure Cosmos DB-gyűjtemények (jelenleg nyilvános előzetes verzióban), ahol minden dokumentum összetett beágyazott tulajdonságokat tartalmazhat.

A kiszolgáló nélküli SQL-készlet minden beágyazott típust JSON-objektumként és tömbként formáz. Így JSON-függvényekkel kinyerheti vagy módosíthatja az összetett objektumokat , vagy elemezheti a JSON-adatokat az OPENJSON függvénnyel.

Íme egy példa egy lekérdezésre, amely skaláris és objektumértékeket nyer ki a COVID-19 Open Research Dataset JSON-fájlból, amely beágyazott objektumokat tartalmaz:

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;

A JSON_VALUE függvény skaláris értéket ad vissza a megadott elérési út mezőiből. A JSON_QUERY függvény egy JSON formátumú objektumot ad vissza a megadott elérési út mezőjéből.

Fontos

Ez a példa a COVID-19 Open Research Dataset fájljait használja. Itt tekintse meg az engedély és az adatok struktúráját.

Előfeltételek

Első lépésként hozzon létre egy adatbázist, amelyben létrejön az adatforrás. Ezután inicializálja az objektumokat egy beállítási szkript futtatásával az adatbázisban. A beállítási szkript létrehozza a mintákban használt adatforrásokat, adatbázis-hatókörű hitelesítő adatokat és külső fájlformátumokat.

Projektbe ágyazott vagy ismétlődő adatok

A Parquet-fájlok több, összetett típusú oszlopot tartalmazhatnak. Az oszlopokból származó értékek JSON-szövegként vannak formázva, és VARCHAR oszlopként jelennek meg. A következő lekérdezés beolvassa a structExample.parquet fájlt, és bemutatja, hogyan olvashatja be a beágyazott oszlopok értékeit:

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];

Ez a lekérdezés a következő eredményt adja vissza. Minden beágyazott objektum tartalma JSON-szövegként lesz visszaadva.

DateStruct TimeStruct Időbélyegstruktúra DecimalStruct FloatStruct
{"Date":"2009-04-25"} {"Time":"20:51:54.3598000"} {"Időbélyeg":"5501-04-08 12:13:57.4821000"} {"Decimális":11143412.25350} {"Float":0.5}
{"Date":"1916-04-29"} {"Time":"00:16:04.6778000"} {"Időbélyeg":"1990-06-30 20:50:52.6828000"} {"Decimális":1963545.62800} {"Float":-2.125}

A következő lekérdezés beolvassa az justSimpleArray.parquet fájlt. A Parquet-fájl összes oszlopát kivetüli, beleértve a beágyazott és ismétlődő adatokat is.

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

Ez a lekérdezés a következő eredményt adja vissza:

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

Tulajdonságok beolvasása beágyazott objektumoszlopokból

A JSON_VALUE függvény lehetővé teszi, hogy JSON-szövegként formázott oszlopok értékeit adja vissza:

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;

Az eredmény az alábbi táblázatban látható:

cím first_author_name body_text complex_column
Kiegészítő információk Egy öko-epidemiolo... Julien - S1. ábra: Phylogeny a... { "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"

A JSON-fájloktól eltérően, amelyek a legtöbb esetben egyetlen, összetett JSON-objektumot tartalmazó oszlopot adnak vissza, a Parquet-fájlok több összetett oszlopot is tartalmazhatnak. A beágyazott oszlopok tulajdonságait az egyes oszlopokon JSON_VALUE lévő függvénnyel olvashatja el. OPENROWSET lehetővé teszi a beágyazott tulajdonságok elérési útvonalainak közvetlen megadását egy WITH záradékban. Beállíthatja az elérési utakat egy oszlop neveként, vagy hozzáadhat egy JSON-elérésiút-kifejezést az oszloptípus után.

Az alábbi lekérdezés beolvassa a structExample.parquet fájlt, és bemutatja, hogyan lehet egy beágyazott oszlop elemeit felszínre tenni. A beágyazott értékekre kétféleképpen hivatkozhat:

  • Adja meg a beágyazott érték elérési útjának kifejezést a típus specifikációja után.
  • Ha az oszlop nevét beágyazott elérési útként formázja a "." paranccsal a mezőkre való hivatkozáshoz.
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];

Ismétlődő oszlopok elemeinek elérése

A következő lekérdezés beolvassa az justSimpleArray.parquet fájlt, és JSON_VALUE használatával lekér egy skaláris elemet egy ismétlődő oszlopból, például tömbből vagy térképből:

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];

Az eredmény a következő:

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

Alobjektumok elérése összetett oszlopokból

A következő lekérdezés beolvassa a mapExample.parquet fájlt, és JSON_QUERY használatával kér le egy nem skaláris elemet egy ismétlődő oszlopból, például tömbből vagy térképből:

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

Explicit módon hivatkozhat a záradékban WITH visszaadni kívánt oszlopokra is:

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];

A struktúra MapOfPersons VARCHAR oszlopként lesz visszaadva, és JSON-sztringként van formázva.

Ismétlődő oszlopokból származó projektértékek

Ha egyes oszlopokban skaláris értékek tömbje van (például [1,2,3]), egyszerűen kibonthatja és összekapcsolhatja őket a fő sortal az alábbi szkripttel:

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

Következő lépések

A következő cikk bemutatja, hogyan kérdezhet le JSON-fájlokat.