使用 Azure 数据工厂解析列中的 JSON 字符串

qui*_*are 4 json azure azure-data-factory

这是我的情况

我有 Azure 表作为源,我的目标是 Azure SQL 数据库。源表看起来像这样:

ID 文件名 元数据
1 文件_1.txt {“公司”:{“id”:555,“名称”:“A公司”},“质量”:[{“质量”:3,“文件名”:“file_1.txt”},{“质量”: 4、“file_name”:“未知”}]}
2 文件_2.txt {"公司": { "id": 231, "姓名": "公司B" }, "质量": [{"质量": 4, "文件名": "file_2.txt"}, {"质量": 3、“file_name”:“未知”}]}
3 文件_3.txt {“公司”:{“id”:111,“名称”:“C公司”},“质量”:[{“质量”:5,“文件名”:“未知”},{“质量”:4, "file_name": "file_3.txt"}]}

目标表应该如下所示:

ID 文件名 公司 质量
1 文件_1.txt A公司 3
2 文件_2.txt B公司 4
3 文件_3.txt C公司 4

这意味着我需要解析该字符串中的数据以获取新的列值,并根据源中的 file_name 列使用质量值。

我做的第一件事是创建一个复制管道,将数据从 Azure 表 1 对 1 传输到 Azure Data Lake Store 上的 parquet 文件,以便我可以将其用作数据流中的源。接下来,想法是使用派生列并使用一些表达式来获取数据,但据我所知,没有表达式将此字符串视为 JSON 对象。

因此,下一个想法可能是在此过程之前添加一个步骤,我将元数据列的内容提取到 ADLS 上的单独文件中,并使用该文件作为源或查找,并将其定义为 JSON 文件。这意味着我需要将 id 值添加到 JSON 文件,以便我能够将数据绑定回记录。

第一个解决方案看起来更有希望,但如果这不是一个选择,我将研究其他可能的解决方案。

谢谢

Jos*_* Xu 5

我的调试结果如下:\n在此输入图像描述

\n
    \n
  1. 我认为你可以使用 OPENJASON 来解析 JSON 字符串。
  2. \n
\n
    select t.id, A.Company,A.quality,A.file_name,A.quality_s,A.file_name_s\n        from dbo.test t\n        CROSS APPLY OPENJSON(t.metadata) \n        WITH (\n            company varchar(255) \'$.Company.Name\',\n            quality varchar(255) \'$.quality[0].quality\',\n            file_name varchar(255) \'$.quality[0].file_name\',\n            quality_s varchar(255) \'$.quality[1].quality\',\n            file_name_s varchar(255) \'$.quality[1].file_name\'\n        ) A\n
Run Code Online (Sandbox Code Playgroud)\n

查询结果如下:
\n在此输入图像描述
\n然后使用数据流再做进一步的处理。当我回到我的电脑时,我会向你展示详细信息。

\n
    \n
  1. 使用 ADF 中的复制活动,将查询结果复制到 csv 中。\n在此输入图像描述

    \n
  2. \n
  3. 使用数据流处理此 csv 文件。将复制活动生成的csv文件设置为源,数据预览如下:\n在此输入图像描述

    \n
  4. \n
  5. 用于DerivedColumn1生成新列,
    \n FileName: case(equalsIgnoreCase(file_name,\'unknown\'),file_name_s,file_name),
    \n QualityS: case(equalsIgnoreCase(file_name,\'unknown\'),quality_s,quality)\n在此输入图像描述\n数据预览如下:\n在此输入图像描述

    \n
  6. \n
  7. 使用Select1活动过滤我们想要的列\xe3\x80\x82\n在此输入图像描述\n数据预览如下:\n在此输入图像描述

    \n
  8. \n
  9. 然后我们可以将结果存入 SQL 表。

    \n
  10. \n
\n