如何处理 Azure 数据工厂 2 中的双管道分隔符
How to handle double pipe delimiter in Azure Data Factory 2
我正在使用一个双管道分隔文件,我想通过数据工厂将其摄取到 Azure SQL 数据库 (2):
Column1||Column2||Column3
在我的输入数据集中,我在 typeProperties 的格式部分将双竖线定界符指定为 columnDelimiter:
"format": {
"type": "TextFormat",
"rowDelimiter": "\n",
"columnDelimiter": "||",
"skipLineCount": 2
}
不幸的是,这不起作用。所有行都标记为 "incompatible",我的 SQL table 中没有数据。接下来,我尝试了一些事情。当未指定任何 columnDelimiter 时,完整的行将被提取到我的 SQL table 的第一列中,因此根本不考虑分隔符。这是不正确的,逻辑上每个数据项都必须在单独的列中摄取。在 Unicode 中编写 ||
脚本也没有修复它。将我的输入文件转换为单管道分隔时,它工作正常。但是,在最终状态下我无法更改输入文件,因此处理双管道定界符是必不可少的。
基于 text format allowed rules ,只允许一个字符。我什至想使用转义分隔符来避免它,但它也被禁止了。
因此,您似乎需要在复制之前处理您的数据 activity.Since ADF 支持从 HTTP endpoint 复制数据,因此我建议您执行以下步骤:
- 使用 Azure Functions 通过流方式逐行读取文件。
2.Replace 所有 '||'用'|'并在响应中设置它。(不要忘记'\n')
3.ADF 将列分隔符设置为“|”并从 HTTP 端点复制数据。
这个解决方案可以处理大数据,当然,如果你不想做这么复杂的工作,你可以直接处理你的数据并将其保存为 ADF 的临时文件。
希望对你有帮助。
您可以要求输入文件的创建者使用单个分隔符(就像大多数人那样),否则您必须进行一些预处理。例如,您可以使用 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 数据库,并且刚刚进行了快速测试,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 SQL 数据库 (2):
Column1||Column2||Column3
在我的输入数据集中,我在 typeProperties 的格式部分将双竖线定界符指定为 columnDelimiter:
"format": {
"type": "TextFormat",
"rowDelimiter": "\n",
"columnDelimiter": "||",
"skipLineCount": 2
}
不幸的是,这不起作用。所有行都标记为 "incompatible",我的 SQL table 中没有数据。接下来,我尝试了一些事情。当未指定任何 columnDelimiter 时,完整的行将被提取到我的 SQL table 的第一列中,因此根本不考虑分隔符。这是不正确的,逻辑上每个数据项都必须在单独的列中摄取。在 Unicode 中编写 ||
脚本也没有修复它。将我的输入文件转换为单管道分隔时,它工作正常。但是,在最终状态下我无法更改输入文件,因此处理双管道定界符是必不可少的。
基于 text format allowed rules ,只允许一个字符。我什至想使用转义分隔符来避免它,但它也被禁止了。
因此,您似乎需要在复制之前处理您的数据 activity.Since ADF 支持从 HTTP endpoint 复制数据,因此我建议您执行以下步骤:
- 使用 Azure Functions 通过流方式逐行读取文件。
2.Replace 所有 '||'用'|'并在响应中设置它。(不要忘记'\n')
3.ADF 将列分隔符设置为“|”并从 HTTP 端点复制数据。
这个解决方案可以处理大数据,当然,如果你不想做这么复杂的工作,你可以直接处理你的数据并将其保存为 ADF 的临时文件。
希望对你有帮助。
您可以要求输入文件的创建者使用单个分隔符(就像大多数人那样),否则您必须进行一些预处理。例如,您可以使用 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 数据库,并且刚刚进行了快速测试,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。例如,您可以让数据工厂使用存储过程任务来执行。