我正在使用双管道分隔文件,我想通过Data Factory(2)在Azure SQL DB中提取:
列1列2 || ||栏3
在我的输入数据集中,我在typeProperties的格式部分中将双管分隔符指定为columnDelimiter:
"format": {
"type": "TextFormat",
"rowDelimiter": "\n",
"columnDelimiter": "||",
"skipLineCount": 2
}
不幸的是,这不起作用。所有行都标记为“不兼容”,并且我的SQL表中没有数据被摄取。接下来,我尝试了一些事情。如果未指定任何columnDelimiter,则会在SQL表的第一列中提取完整行,因此根本不会考虑分隔符。这是不正确的,逻辑上每个数据项必须在单独的列中摄取。脚本编写||在Unicode中也没有修复它。将我的输入文件转换为单个管道分隔时,它可以正常工作。但是,在最终状态中,我无法更改输入文件,因此处理双管分隔符至关重要。
有什么想法?提前谢谢!
答案 0 :(得分:1)
基于text format allowed rules,只允许一个字符。我甚至想使用转义分隔符来避免它,但它也被禁止。
因此,您似乎需要在复制活动之前处理数据。因为ADF支持从HTTP endpoint复制数据,所以我建议您按照以下步骤操作:
2.更换所有'||'用'|'并在响应中设置它。(别忘了'\ n')
3.ADF将列分隔符设置为“|”并从HTTP端点复制数据。
此解决方案可以处理大尺寸数据,当然,如果您不想执行此类复杂工作,您可以直接处理数据并将其另存为ADF的临时文件。
希望它对你有所帮助。
答案 1 :(得分:1)
您可以要求输入文件的创建者使用单个分隔符(与大多数人一样),否则您必须进行一些预处理。例如,您可以使用U-SQL步骤更正文件,然后将该文件导入SQL DB,例如一些简单的U-SQL:
// Multiple column delimiters
@input =
EXTRACT
col1 string
FROM "/input/input91.txt"
USING Extractors.Text(delimiter:'~', skipFirstNRows:1);
// Do some other processing here?
@output = SELECT col1.Replace("||", "|") AS col2 FROM @input;
OUTPUT @output
TO "/output/output.txt"
USING Outputters.Text(delimiter : '|', quoting : false);
NB这里我使用了一个分隔符(代字号“〜”),我知道它不会出现在输入文件中,无法将所有列有效地导入为一列,然后将其修复。
您使用两个分隔符是否有特殊原因?
此外,如果您的文件位于blob存储上,那么您现在可以BULK INSERT
进入Azure SQL DB,并且刚刚给出了快速测试,BULK INSERT可以处理多个分隔符,例如
DROP TABLE IF EXISTS #tmp
CREATE TABLE #tmp (
a VARCHAR(50),
b VARCHAR(50),
c VARCHAR(50),
)
GO
BULK INSERT #tmp
FROM 'D:\Data Lake\USQLDataRoot\input\input91.txt'
WITH ( FIELDTERMINATOR = '||', DATA_SOURCE = '<yourDataSource>' );
有关涉及创建外部数据源和凭据的步骤的详细信息,请参阅here。然后,您可以让Data Factory使用Stored Proc任务来执行,例如。