Чтение JSON в Azure Synapse

#json #csv #tsql #azure-synapse

Вопрос:

Я пытаюсь понять код для чтения файла JSON в Synapse Analytics. И вот код, предоставленный документацией Microsoft: Запрашивайте файлы JSON с помощью бессерверного пула SQL в Azure Synapse Analytics

 select top 10 *
from openrowset(
        bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.jsonl',
        format = 'csv',
        fieldterminator ='0x0b',
        fieldquote = '0x0b'
    ) with (doc nvarchar(max)) as rows
go
 

Интересно, почему format = 'csv' . Пытается ли он конвертировать JSON в CSV, чтобы выровнять файл?

Комментарии:

1. Нет, этот format параметр был добавлен в SQL Server 2017, в котором на данный момент есть только один параметр; CSV, чтобы сообщить СУБД, что файл соответствует стандарту RF4810. Однако на самом деле это не относится к вышесказанному. Почему они просто не прочитали файл как a SINGLE_CLOB , я не знаю (я предполагаю, что Azure Synapse может импортировать как CLOB).

2. @Larnu, я предполагаю, что вы имели в виду RFC 4180 , а не 4810 :-) . FORMAT = 'CSV' указывает файл значений, разделенных запятыми.

3. @RonenAriely , да , ясно, что я «толстыми пальцами» 8 перед 1. 🙂

Ответ №1:

Почему они просто не прочитали файл как ОДИНОЧНЫЙ файл, я не знаю

При использовании SINGLE_CLOB весь файл важен как одно значение, а содержимое файла в документе не очень хорошо отформатировано как один JSON. Использование SINGLE_CLOB заставит нас выполнить больше работы после использования openrowset, прежде чем мы сможем использовать содержимое в качестве JSON (поскольку это недопустимый JSON, нам нужно будет проанализировать значение). Это можно сделать, но, вероятно, потребуется больше работы.

Формат файла представляет собой несколько строк, похожих на JSON, каждая в отдельной строке. «JSON с разделителями строк», как это называется в документе.

Кстати, если вы проверите историю документа на GitHub, то обнаружите, что изначально это было не так. Насколько я помню, первоначально файл включал один документ JSON с массивом объектов (был завернут [] после загрузки). Кто-то по имени «Ронен Ариели» на самом деле обнаружил эту проблему в документе, поэтому вы можете увидеть мое имя в списке, если авторы документа: -)

введите описание изображения здесь

Интересно, почему format = 'csv' . Пытается ли он преобразовать json в csv, чтобы выровнять иерархию?

(1) JSON не является типом данных в SQL Server. Имя типа данных JSON отсутствует. То, что у нас есть в SQL Server, — это такие инструменты, как функции, которые работают с текстом и обеспечивают поддержку строк, подобных формату JSON. Поэтому мы не КОНВЕРТИРУЕМ в JSON или из JSON.

(2) format Параметр не имеет никакого отношения к JSON. Он указывает, что содержимое файла представляет собой файл значений, разделенных запятыми. Вы можете (и должны) использовать его всякий раз, когда ваш файл хорошо отформатирован как файл значений, разделенных запятыми (также широко известный как csv-файл).

В этом конкретном примере документа значения в файле csv представляют собой строки, каждая из которых имеет допустимый формат JSON. Только после того, как вы прочитаете файл с помощью набора openrowset, мы начнем анализировать содержимое текста в формате JSON.

Обратите внимание, что только после заголовка «Анализ документов JSON» в документе документ начинает говорить о разборе текста как JSON.

Комментарии:

1. Хорошо, теперь все ясно. Большое спасибо!

2. Я рад слышать, что смог помочь @Sonia. Пожалуйста, не забудьте закрыть тему, чтобы другие люди не тратили свое время на ее проверку, чтобы решить вопрос, на который уже был дан ответ 🙂