我正在使用双管道分隔文件,我想通过数据工厂将其引入 Azure SQL DB (2):
Column1||Column2||Column3
在我的输入数据集中,我在 typeProperties 的格式部分中将双管分隔符指定为 columnDelimiter:
"format": {
"type": "TextFormat",
"rowDelimiter": "\n",
"columnDelimiter": "||",
"skipLineCount": 2
}
不幸的是,这不起作用。所有行都被标记为“不兼容”,并且我的 SQL 表中没有提取任何数据。接下来,我尝试了一些事情。当未指定任何 columnDelimiter 时,完整的行将被提取到 SQL 表的第一列中,因此根本不考虑分隔符。这是不正确的,从逻辑上讲,每个数据项必须提取到单独的列中。用 Unicode 编写 ||
脚本也没有解决这个问题。当我的输入文件转换为单管道分隔时,它工作正常。但是,在最终状态下,我无法更改输入文件,因此处理双管道分隔符至关重要。
最佳答案
您可以要求输入文件的创建者使用单个分隔符(就像大多数人一样),否则您必须进行一些预处理。例如,您可以使用 U-SQL 步骤来更正文件,然后将该文件导入到 SQL 数据库中,例如一些简单的 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);
注意,这里我使用了一个分隔符(波形符“~”),我知道它不会出现在输入文件中,以有效地将所有列导入为一列,然后修复它。
使用两个分隔符有什么特殊原因吗?
此外,如果您的文件位于 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有关涉及创建外部数据源和凭据的步骤的更多信息。例如,您可以让数据工厂使用存储过程任务来执行。
关于azure - 如何处理 Azure 数据工厂 2 中的双管道分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316081/