如何处理 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 复制数据,因此我建议您执行以下步骤:

  1. 使用 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。例如,您可以让数据工厂使用存储过程任务来执行。