Zapytania zagnieżdżone typy w plikach Parquet i JSON przy użyciu bezserwerowej puli SQL w usłudze Azure Synapse Analytics
W tym artykule dowiesz się, jak napisać zapytanie przy użyciu bezserwerowej puli SQL w usłudze Azure Synapse Analytics. Zapytanie odczytuje zagnieżdżone typy Parquet. Zagnieżdżone typy to złożone struktury reprezentujące obiekty lub tablice. Zagnieżdżone typy można przechowywać w następujących ździe:
- Parquet, gdzie można mieć wiele złożonych kolumn zawierających tablice i obiekty.
- Hierarchiczne pliki JSON, w których można odczytać złożony dokument JSON jako pojedynczą kolumnę.
- Kolekcje usługi Azure Cosmos DB (obecnie dostępne w publicznej wersji zapoznawczej), w których każdy dokument może zawierać złożone zagnieżdżone właściwości.
Bezserwerowa pula SQL formatuje wszystkie zagnieżdżone typy jako obiekty i tablice JSON. W związku z tym można wyodrębniać lub modyfikować złożone obiekty przy użyciu funkcji JSON lub analizować dane JSON przy użyciu funkcji OPENJSON.
Oto przykład zapytania, które wyodrębnia wartości skalarne i obiekty z pliku JSON zestawu danych Open Research Dataset COVID-19 , który zawiera zagnieżdżone obiekty:
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;
Funkcja JSON_VALUE
zwraca wartość skalarną z pola w określonej ścieżce. Funkcja JSON_QUERY
zwraca obiekt sformatowany jako JSON z pola w określonej ścieżce.
Ważne
W tym przykładzie użyto pliku z zestawu danych Open Research Dataset covid-19. Zobacz licencję i strukturę danych tutaj.
Wymagania wstępne
Pierwszym krokiem jest utworzenie bazy danych, w której zostanie utworzone źródło danych. Następnie zainicjujesz obiekty, uruchamiając skrypt instalacyjny w bazie danych. Skrypt instalacji utworzy źródła danych, poświadczenia o zakresie bazy danych i zewnętrzne formaty plików, które są używane w przykładach.
Zagnieżdżone lub powtarzające się dane projektu
Plik Parquet może zawierać wiele kolumn ze złożonymi typami. Wartości z tych kolumn są formatowane jako tekst JSON i zwracane jako kolumny VARCHAR. Następujące zapytanie odczytuje plik structExample.parquet i pokazuje, jak odczytywać wartości zagnieżdżonych kolumn:
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];
To zapytanie zwraca następujący wynik. Zawartość każdego zagnieżdżonego obiektu jest zwracana jako tekst JSON.
DateStruct | TimeStruct | TimestampStruct | DecimalStruct | FloatStruct |
---|---|---|---|---|
{"Date":"2009-04-25"} | {"Time":"20:51:54.3598000"} | {"Sygnatura czasowa":"5501-04-08 12:13:57.4821000"} | {"Decimal":11143412.25350} | {"Float":0.5} |
{"Date":"1916-04-29"} | {"Time":"00:16:04.6778000"} | {"Sygnatura czasowa":"1990-06-30 20:50:52.6828000"} | {"Decimal":1963545.62800} | {"Float":-2.125} |
Poniższe zapytanie odczytuje plik justSimpleArray.parquet. Projektuje wszystkie kolumny z pliku Parquet, w tym zagnieżdżone i powtarzające się dane.
SELECT
SimpleArray
FROM
OPENROWSET(
BULK 'parquet/nested/justSimpleArray.parquet',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT='PARQUET'
) AS [r];
To zapytanie zwróci następujący wynik:
SimpleArray |
---|
[11,12,13] |
[21,22,23] |
Odczytywanie właściwości z zagnieżdżonych kolumn obiektów
Funkcja JSON_VALUE
umożliwia zwracanie wartości z kolumn sformatowanych jako tekst 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;
Wynik jest wyświetlany w poniższej tabeli:
tytuł | first_author_name | body_text | complex_column |
---|---|---|---|
Dodatkowe informacje eko-epidemiolo... | Julien | - Rysunek S1: Phylogeny... | { "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" |
W przeciwieństwie do plików JSON, które w większości przypadków zwracają jedną kolumnę zawierającą złożony obiekt JSON, pliki Parquet mogą mieć wiele złożonych kolumn. Właściwości kolumn zagnieżdżonych można odczytać przy użyciu JSON_VALUE
funkcji w każdej kolumnie.
OPENROWSET
umożliwia bezpośrednie określenie ścieżek zagnieżdżonych właściwości w klauzuli WITH
. Ścieżki można ustawić jako nazwę kolumny lub dodać wyrażenie ścieżki JSON po typie kolumny.
Poniższe zapytanie odczytuje plik structExample.parquet i pokazuje, jak uwidocznieć elementy zagnieżdżonej kolumny. Istnieją dwa sposoby odwołowania się do wartości zagnieżdżonej:
- Określając wyrażenie ścieżki wartości zagnieżdżonej po specyfikacji typu.
- Formatowanie nazwy kolumny jako ścieżki zagnieżdżonej przy użyciu polecenia "" w celu odwołania się do pól.
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];
Uzyskiwanie dostępu do elementów z powtarzających się kolumn
Następujące zapytanie odczytuje plik justSimpleArray.parquet i używa JSON_VALUE do pobrania elementu skalarnego z powtarzającej się kolumny, takiej jak tablica lub mapa:
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];
Oto wynik:
SimpleArray | FirstElement | SecondElement | Trzeci element |
---|---|---|---|
[11,12,13] | 11 | 12 | 13 |
[21,22,23] | 21 | 22 | 23 |
Uzyskiwanie dostępu do obiektów podrzędnych z kolumn złożonych
Następujące zapytanie odczytuje plik mapExample.parquet i używa JSON_QUERY do pobrania elementu nieskalarnego z powtarzającej się kolumny, takiej jak tablica lub mapa:
SELECT
MapOfPersons,
JSON_QUERY(MapOfPersons, '$."John Doe"') AS [John]
FROM
OPENROWSET(
BULK 'parquet/nested/mapExample.parquet',
DATA_SOURCE = 'SqlOnDemandDemo',
FORMAT='PARQUET'
) AS [r];
Możesz również jawnie odwołać się do kolumn, które mają zostać zwrócone w klauzuli 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];
Struktura MapOfPersons
jest zwracana jako kolumna VARCHAR i sformatowana jako ciąg JSON.
Wartości projektu z powtarzających się kolumn
Jeśli masz tablicę wartości skalarnych (na przykład [1,2,3]
) w niektórych kolumnach, możesz je łatwo rozwinąć i połączyć je z głównym wierszem przy użyciu tego skryptu:
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
Następne kroki
W następnym artykule przedstawiono sposób wykonywania zapytań dotyczących plików JSON.