在 Azure Synapse 中阅读 JSON

Reading JSON in Azure Synapse

我正在尝试理解用于在 Synapse Analytics 中读取 JSON 文件的代码。这是 Microsoft 文档提供的代码: Query JSON files using serverless SQL pool in 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 以展平文件?

Why they didn't just read the file as a SINGLE_CLOB I don't know

当您使用 SINGLE_CLOB 时,整个文件作为一个值很重要,并且文档中的文件内容格式不正确作为单个 JSON。使用 SINGLE_CLOB 将使我们在使用 openrowset 之后做更多的工作,然后我们才能将内容用作 JSON(因为它无效 JSON 我们需要解析该值)。它可以完成,但可能需要更多工作。

文件的格式是多个JSON类似的字符串,每一个在单独的行中。 “line-delimited JSON”,文档中这样称呼它。

顺便说一句,如果您查看GitHub 处文档的历史记录,您会发现原来并非如此。据我所知,最初该文件包含一个 JSON 文档和一个 objects 数组(加载后用 [] 包裹)。实际上,名为“Ronen Ariely”的人在文档中发现了这个问题,这就是为什么如果文档的作者,您可以在列表中看到我的名字:-)

I wonder why the format = 'csv'. Is it trying to convert json to csv to flatten the hierarchy?

(1) JSON 不是 SQL 服务器中的数据类型。没有数据类型名称 JSON。我们在 SQL 服务器中拥有的工具类似于函数,可以处理文本并提供对 JSON 类似格式的字符串的支持。因此,我们不会转换为 JSON 或从 JSON.

(2) format参数与JSON无关。它指定文件的内容是逗号分隔值文件。只要您的文件格式正确为逗号分隔值文件(也通常称为 csv 文件),您就可以(并且应该)使用它。

在文档的这个特定示例中,csv 文件中的值是字符串,每个字符串都具有有效的 JSON 格式。只有在您使用 openrowset 读取文件后,我们才开始将文本内容解析为 JSON.

注意只有在文档中的标题“Parse JSON documents”之后,文档才开始谈到将文本解析为JSON。