在 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