复制数据活动中的ADF合并复制JSON文件会为映射数据流创建错误

时间:2020-07-20 15:38:21

标签: json azure-data-factory azure-data-factory-2

我正在尝试在ADF中进行一些优化。安装程序是一种第三方工具,每个对象将一个JSON文件复制到BLOB存储容器中。这些输入到映射数据流。第三方工具编写的单个文件效果很好。如果我使用Azure复制数据活动将这些文件复制到另一个BLOB文件夹,则MDF将无法再解析文件并给出错误:“ JSON解析错误,不支持的编码或多行。”我从合并文件开始,但是无论选择哪种复制行为,结果都是相同的。

第二编辑:经过一天的工作,我发现从JSON复制活动合并文件到JSON肯定会在将每个JSON对象导入到合并文件时为其添加EOL字符。我还发现,合并文件中的那些EOL字符肯定会使MDF失败。如果我从合并文件中删除所有EOL字符,则相同的MDF将起作用。对我来说,这是一个错误。复制活动正在添加一个破坏MDF的字符。我的某些数据似乎有第二个问题,它不是作为一个单独的文件不会失败,但是在连接时会出现问题,当我尝试将所有文​​件拉在一起时会破坏MDF,但是我已经测试了1-5000的基本行为文件,并能够重复失败/成功测试。

我拿了原始文件和复制的文件,并通过各种测试对它们进行了测试,最终我将其转储到Notepad ++中时发现了这些内容: 复制的文件:

{"CustomerMasterData":{"Customer":[{"ID":"123456","name":"Customer Name",}]}}\r\n

原始文件:

{"CustomerMasterData":{"Customer":[{"ID":"123456","name":"Customer Name",}]}}\n

如果我将复制的文件从\ r \ n结尾更改为\ n,则MDF可以再次读取该文件。这里发生了什么?以及如何更改文件写入行为或MDF设置,以便可以在没有CRLF的情况下连接或复制文件?

编辑:新信息-似乎在进一步审查中,也许缩小/空格删除是罪魁祸首。如果我下载了由ADF副本创建的文件,并使用JSON格式化程序对其进行了格式化,那么它将起作用。也许CRLF-> LF掩盖了其他内容。我目前不确定该怎么办,但实在令人沮丧。 其他可能相关的信息:

  • 源和接收器JSON数据集都设置为使用UTF-8(尽管我尝试过,但不是默认值(UTF-8))。不同的编码会解决这个问题吗?
  • 我尝试重新映射架构,创建新数据集,创建新的映射数据流,但仍然遇到相同的错误。

根据注释进行了编辑,以使内容更加清晰: 对于文件中的单个JSON元素,我可以使其正常工作-数据预览在运行时返回与管道相同的成功或失败 single JSON case

如果ADF合并了多个文档,则改为显示以下内容。似乎在进一步审查中,也许缩小/空格删除是罪魁祸首。如果我下载了由ADF副本创建的文件,并使用JSON格式化程序对其进行了格式化,那么它将起作用。也许CRLF-> LF掩盖了其他内容。我不确定此时该怎么办,但是它非常令人沮丧。 multiple JSON case

Repro:将任何有效的JSON创建为单个文件,将其放在blob存储中,用作映射数据流中的源,以执行任何接收器操作。创建具有相同架构的第二个文件,使用通配符路径使它们都以相同的流程运行。使用带有合并文件的复制活动作为接收器复制活动,并使用对象数组作为文件模式。尝试使您的MDF使用此新文件。如果失败,请下载ADF创建的文件,通过格式化程序运行它(我已经使用了VS Code->来自标准VS Code JSON扩展名的“格式化文档”和VS 2019“ Unminify”命令)并重新上传...应该现在可以工作。

2 个答案:

答案 0 :(得分:1)

不知道您是否已经解决了问题:我 3 天前遇到了完全相同的问题,经过多次尝试后我找到了解决方案:

  1. 在sink设置下的复制数据活动中,使用File Pattern下的“对象集”(而不是“对象数组”),这样合并后的大JSON具有每行写入的原始小JSON文件的值< /li>
  2. 在使用 *.json 模式设置通配符路径后的 MDF 中,在 JSON 设置下选择:每行文档作为文档表单。
    之后你应该很高兴,至少它解决了我的问题。复制数据活动中“对象数组”设置中的自动写入 CRLF 应为默认设置,并且 MSFT 应提供选项以在将来的设置中省略它。

答案 1 :(得分:0)

根据我的测试:

1.copy数据活动无法将unix(LF)更改为windows(CRLF)。

2.MDF还可以解析unix(LF)文件和Windows(CRLF)文件。

也许还有其他问题。 顺便说一句,我看到原始文件中"name":"Customer Name"后面有一个逗号,我在测试前将其删除。