在 Azure Synapse 中读取 JSON

Posted

技术标签:

【中文标题】在 Azure Synapse 中读取 JSON【英文标题】:Reading JSON in Azure Synapse 【发布时间】:2021-11-11 05:25:57 【问题描述】:

我正在尝试了解在 Synapse Analytics 中读取 JSON 文件的代码。这是微软文档提供的代码: 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 以展平文件?

【问题讨论】:

不,format 参数是 SQL Server 2017 中添加的,目前只有一个参数; CSV 告诉 RDBMS 该文件符合 RF4810。不过,上述情况并非如此。为什么他们不只是将文件读取为 SINGLE_CLOB 我不知道(我假设 Azure Synapse 可以作为 CLOB 导入)。 @Larnu,我假设您的意思是 RFC 4180 而不是 4810 :-)FORMAT = 'CSV' 指定一个逗号分隔值文件。 @RonenAriely,是的,很明显我在 1 之前“胖手指”了 8。:) 【参考方案1】:

为什么他们不只是将文件读取为 SINGLE_CLOB 我不知道

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

文件的格式是多个 JSON 的类似字符串,每个字符串都在单独的行中。 “行分隔的 JSON”,正如文档中所说的那样。

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

我想知道为什么format = 'csv'。是否试图将 json 转换为 csv 以展平层次结构?

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

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

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

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

【讨论】:

很好,现在很清楚了。非常感谢! 我很高兴听到我可以帮助@Sonia。请记住关闭线程,这样其他人就不会浪费时间检查它以解决已经回答的问题:-)

以上是关于在 Azure Synapse 中读取 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将 Azure Databricks 增量表迁移到 Azure Synapse SQL 池

Azure Synapse Polybase/外部表 - 我们可以在创建外部表时从文件中获取行号吗

Azure Synapse Pipeline Notebook 返回错误

获取数据流活动中接收器操作写入的输出文件的 blob URL - Azure Synapse Analytics

Azure Synapse 专用 sql 池未在 Synapse Studio 中显示数据对象

Azure 数据工厂中的 Azure Synapse 存储过程:是同步调用吗?