azure - 如何处理 Azure 数据工厂 2 中的双管道分隔符

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

我正在使用双管道分隔文件,我想通过数据工厂将其引入 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/

相关文章:

azure - Azure 辅助角色上的并发连接

Azure 搜索服务与最新 Azure SQL 数据库实例中的全文搜索?

performance - SQL Azure 和 READ_COMMITTED_SNAPSHOT

Java 扫描仪 - 使用新行作为分隔符,但不是空格?

sql-server - 从azure函数访问azure数据库

azure - 使用 TFS 将 SQL 项目部署到 Azure SQL 数据库的方法

在诊断设置中手动更改存储帐户后,Azure 启动诊断屏幕截图不起作用

sql - 如何在线创建非聚集索引(如果可用)

php - 不在 () 之间时分解字符串