【问题标题】:Azure Synapse - Query JSON using OPENROWSET - FIELDTERMINATOR Value 0x0bAzure Synapse - 使用 OPENROWSET 查询 JSON - FIELDTERMINATOR 值 0x0b
【发布时间】:2022-01-24 18:34:55
【问题描述】:

在 Azure Synapse 无服务器 SQL 池中,在通过 CSV 解析器使用 OPENROWSET 读取 JSON 文档时,我们必须将 FIELDTERMINATOR 和 FIELDQUOTE 指定为“0x0b”(垂直选项卡)。有人可以帮忙理解一下原因吗?

如果是单行 JSON (JSONL),则文件中的每一行都是一个 JSON 文档,我希望将整行作为单个值读取,而不需要指定 FIELDTERMINATOR 或 FIELDQUOTE。

我们是否只是覆盖了字段终止符的默认值是逗号 (,) 而字段完全是双引号 (")?如果是这样,'0x0b' 的意义是什么?

文档在这里 - https://docs.microsoft.com/en-us/azure/synapse-analytics/sql/query-json-files

以下文档中的示例代码

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

【问题讨论】:

    标签: azure azure-synapse


    【解决方案1】:

    是的,我们将覆盖 csv 默认参数以与 json 兼容。这些参数使 Synapse 读取文本文件中的行并正确处理 json/jsonl 内容。以下是一些背景原因:

    OPENROWSET 是为读取多种文件格式的文件而创建的。 Synapse serverless 当前支持 csv、parquet 和 delta(delta Lake)。 OPENROWSET 不支持将 json 作为单独的格式。由于 json 和 csv 都是相似的文本文件,因此使用带有合适参数的 csv 格式来读取 json。实际上,在这种情况下,OPENROWSET 本身并不将文件视为 json 或 jsonl。它将文件视为具有一列和多行的 csv/文本文件。接下来的步骤,例如JSON_VALUE 或 OPENJSON,使 Synapse 将文本视为 json。

    当您指定 format='csv' 时,fieldterminator 和 fieldquote 的默认值是逗号和双引号,就像您说的那样。这些值在读取 json 时会出现问题,因为您的 json 可以包含这些字符用于其他目的。这就是为什么在读取 json 文件时,您需要通过将它们设置为 json 不包含的某个值来使 openrowset 忽略字段终止符和字段引号。不幸的是 csv 格式没有其他方法可以关闭它们。

    字符 0x0b 是一个垂直制表符,现在很少使用。因此,使用此字符使 openrowset 忽略这些参数是一种常见的做法。您也可以使用其他字符,只要它们未在您的 json 中使用。更多关于 VT 历史可以在这里找到:What is a vertical tab?

    您可以尝试在 json 中包含 0x0b 字符,并查看它会引发 Synapse 错误“由于 CSV 数据文件中的列值无效而导致批量加载失败”。

    【讨论】:

    • 感谢@Veikko 的详细解释;这证实了我的理解!
    猜你喜欢
    • 2021-01-14
    • 2021-03-14
    • 2021-06-02
    • 2023-04-06
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2022-01-02
    相关资源
    最近更新 更多