如何在Azure Data Factory 2中处理双管分隔符

时间:2018-05-13 12:23:40

标签: azure azure-sql-database delimiter azure-data-factory

我正在使用双管道分隔文件,我想通过Data Factory(2)在Azure SQL DB中提取:

列1列2 || ||栏3

在我的输入数据集中,我在typeProperties的格式部分中将双管分隔符指定为columnDelimiter:

        "format": {
            "type": "TextFormat",
            "rowDelimiter": "\n",
            "columnDelimiter": "||",
            "skipLineCount": 2
        }

不幸的是,这不起作用。所有行都标记为“不兼容”,并且我的SQL表中没有数据被摄取。接下来,我尝试了一些事情。如果未指定任何columnDelimiter,则会在SQL表的第一列中提取完整行,因此根本不会考虑分隔符。这是不正确的,逻辑上每个数据项必须在单独的列中摄取。脚本编写||在Unicode中也没有修复它。将我的输入文件转换为单个管道分隔时,它可以正常工作。但是,在最终状态中,我无法更改输入文件,因此处理双管分隔符至关重要。

有什么想法?提前谢谢!

2 个答案:

答案 0 :(得分:1)

基于text format allowed rules,只允许一个字符。我甚至想使用转义分隔符来避免它,但它也被禁止。

enter image description here

因此,您似乎需要在复制活动之前处理数据。因为ADF支持从HTTP endpoint复制数据,所以我建议您按照以下步骤操作:

  1. 使用Azure Functions逐行通过流方式读取文件。
  2. 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任务来执行,例如。