我正在使用双管分隔文件,我想通过Data Factory(2)在Azure SQL DB中进行摄取:
列1 ||列2 ||栏3
在我的输入数据集中,我在typeProperties的format部分中将double pipe分隔符指定为columnDelimiter:
"format": {
"type": "TextFormat",
"rowDelimiter": "\n",
"columnDelimiter": "||",
"skipLineCount": 2
}
不幸的是,这不起作用 . 所有行都标记为“不兼容”,并且我的SQL表中没有数据被摄取 . 接下来,我尝试了一些事情 . 如果未指定任何columnDelimiter,则会在SQL表的第一列中提取完整行,因此根本不会考虑分隔符 . 这是不正确的,逻辑上每个数据项必须在单独的列中摄取 . 脚本编写||在Unicode中也没有修复它 . 将我的输入文件转换为单个管道分隔时,它可以正常工作 . 但是,在最终状态中,我无法更改输入文件,因此处理双管分隔符至关重要 .
有什么想法吗?提前致谢!
2 回答
您可以要求输入文件的创建者使用单个分隔符(就像大多数人一样),否则您必须进行一些预处理 . 例如,您可以使用U-SQL步骤更正文件,然后将该文件导入SQL DB,例如一些简单的U-SQL:
NB我在这里使用了一个分隔符(代字号“〜”),我知道它不会出现在输入文件中,无法将所有列有效地导入为一列,然后将其修复 .
您使用两个分隔符是否有特殊原因?
此外,如果您的文件位于blob存储上,那么您现在可以_____82967_进入Azure SQL DB,并且刚刚给出了一个快速测试,BULK INSERT可以处理多个分隔符,例如
有关涉及创建外部数据源和凭据的步骤的详细信息,请参阅here . 然后,您可以让Data Factory使用Stored Proc任务来执行 .
基于text format allowed rules,只允许一个字符 . 我甚至想使用转义分隔符来避免它,但它也被禁止 .
因此,似乎您需要在复制活动之前处理您的数据 . 因为ADF支持从HTTP endpoint复制数据,所以我建议您按照以下步骤操作:
2.更换所有'||'用'|'并在响应中设置它 . (别忘了'\ n')
3.ADF将列分隔符设置为“|”并从HTTP endpoints 复制数据 .
此解决方案可以处理大尺寸数据,当然,如果您不想执行此类复杂工作,您可以直接处理数据并将其另存为ADF的临时文件 .
希望它能帮到你 .