Kueri tipe berlapis di Parquet dan file JSON dengan menggunakan kumpulan SQL tanpa server di Azure Synapse Analytics

Dalam artikel ini, Anda akan mempelajari cara membuat kueri menggunakan kumpulan SQL tanpa server di Azure Synapse Analytics. Kueri akan membaca Parquet tipe berlapis. Tipe berlapis adalah struktur kompleks yang mewakili objek atau array. Tipe berlapis dapat disimpan di:

  • Parquet, di mana Anda dapat memiliki beberapa kolom kompleks yang berisi array dan objek.
  • File JSON hierarkis, tempat Anda dapat membaca dokumen JSON kompleks sebagai satu kolom.
  • Koleksi Azure Cosmos DB (saat ini berada di bawah pratinjau publik yang terjaga), yang setiap dokumennya bisa berisi properti bertumpuk yang kompleks.

Kumpulan SQL tanpa server memformat semua tipe berlapis sebagai objek dan array JSON. Jadi Anda bisa mengekstrak atau memodifikasi objek kompleks dengan menggunakan fungsi JSON atau mengurai data JSON dengan menggunakan fungsi OPENJSON.

Berikut ini contoh kueri yang mengekstrak nilai skalar dan objek dari file JSON COVID-19 Open Research Dataset, yang berisi objek berlapis:

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;

Fungsi JSON_VALUE mengembalikan nilai skalar dari bidang pada jalur yang ditentukan. Fungsi JSON_QUERY mengembalikan objek yang diformat sebagai JSON dari bidang di jalur yang ditentukan.

Penting

Contoh ini menggunakan file dari Himpunan Data Riset Terbuka COVID-19. Lihat lisensi dan struktur data di sini.

Prasyarat

Langkah pertama adalah membuat database tempat datasouce akan dibuat. Anda kemudian akan menginisialisasi objek dengan menjalankan skrip setup pada database. Skrip setup ini akan membuat sumber data, info masuk yang tercakup database, dan format file eksternal yang digunakan dalam sampel ini.

Memproyeksikan data berlapis atau berulang

File Parquet bisa memiliki beberapa kolom dengan tipe kompleks. Nilai dari kolom ini diformat sebagai teks JSON dan akan dikembalikan sebagai kolom VARCHAR. Kueri berikut membaca file structExample.parquet dan memperlihatkan cara membaca nilai kolom berlapis:

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

Kueri ini mengembalikan hasil berikut ini. Konten setiap objek berlapis dikembalikan sebagai teks 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}

Kueri berikut ini membaca file justSimpleArray.parquet. Ini memproyeksikan semua kolom dari file Parquet, termasuk data yang berlapis dan berulang.

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

Kueri ini akan mengembalikan hasil berikut ini:

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

Membaca properti dari kolom objek berlapis

Fungsi JSON_VALUE memungkinkan Anda mengembalikan nilai dari kolom yang diformat sebagai teks 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;

Hasilnya ditampilkan dalam contoh berikut ini:

judul first_author_name body_text complex_column
Informasi Tambahan eko-epidemiolo... Julien - Gambar S1: Phylogeny dari... { "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"

Tidak seperti file JSON, yang pada kebanyakan kasus mengembalikan kolom tunggal yang berisi objek JSON kompleks, file Parquet dapat memiliki beberapa kolom kompleks. Anda dapat membaca properti kolom berlapis dengan menggunakan fungsi JSON_VALUE pada setiap kolom. OPENROWSET memungkinkan Anda untuk secara langsung menentukan jalur properti berlapis dalam WITH klausa. Anda dapat mengatur jalur sebagai nama kolom, atau Anda bisa menambahkan ekspresi jalur JSON setelah tipe kolom.

Kueri berikut membaca file structExample.parquet dan memperlihatkan cara memunculkan elemen kolom berlapis. Ada dua cara untuk mereferensikan nilai berlapis:

  • Dengan menentukan ekspresi jalur nilai berlapis setelah spesifikasi tipe.
  • Dengan memformat nama kolom sebagai jalur berlapis dengan menggunakan lakukan "." untuk mereferensikan bidang.
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];

Mengakses elemen dari kolom berulang

Kueri berikut membaca file justSimpleArray.parquet dan menggunakan JSON_VALUE untuk mengambil elemen skalar dari dalam kolom berulang, seperti array atau peta:

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

Berikut ini hasilnya:

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

Mengakses sub-objek dari kolom kompleks

Kueri berikut membaca file mapExample.parquet dan menggunakan JSON_QUERY untuk mengambil elemen non-skalar dari dalam kolom berulang, seperti array atau peta:

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

Anda juga bisa secara eksplisit mereferensikan kolom yang ingin Anda kembalikan dalam klausa 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];

Struktur MapOfPersons dikembalikan sebagai kolom VARCHAR dan diformat sebagai string JSON.

Memproyeksikan nilai dari kolom berulang

Jika Anda memiliki array nilai skalar (misalnya [1,2,3]) di beberapa kolom, Anda bisa dengan mudah memperluasnya dan menggabungkannya dengan baris utama dengan menggunakan skrip ini:

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

Langkah berikutnya

Artikel berikutnya akan memperlihatkan kepada Anda cara Mengkueri file JSON.