通过 C# .NET Framework 托管数据工厂将数据从 Blob 复制到 Azure SQL 时忽略错误行

Ignore bad rows when copying data from Blob to Azure SQL via C# .NET Framework managed Data Factory

提问人:Hack-R 提问时间:4/5/2020 最后编辑:Hack-R 更新时间:4/8/2020 访问量:294

问:

我将按照本教程从 Blob 中的平面文件加载 Azure SQL 中的数据。

此方法需要 C# .NET Framework 控制台应用来创建/管理 Blob 数据集、Azure SQL 接收器和数据工厂。

唯一的问题是,对于大而混乱的数据文件,我不可避免地会遇到一些包含额外分隔符或格式错误的行。数据太大,无法在上传到 blob 之前在本地清理。

一个正常的解决方案是忽略坏行,即允许容错

有一个如何使用 JSON 执行此操作的示例:

"typeProperties": {
    "source": {
        "type": "BlobSource"
    },
    "sink": {
        "type": "SqlSink",
    },
    "enableSkipIncompatibleRow": true,
    "redirectIncompatibleRowSettings": {
         "linkedServiceName": {
              "referenceName": "<Azure Storage or Data Lake Store linked service>",
              "type": "LinkedServiceReference"
            },
            "path": "redirectcontainer/erroroutput"
     }
}

但是,我无法确定 C# 中是否有等效的。我尝试从中修改 Azure SQL 接收器的原始连接字符串:

    // Specify the sink Azure SQL Database information
    string azureSqlConnString =
        "Server=tcp:mydb.database.windows.net,1433;" +
        "Database=mydb;" +
        "User ID=myuser;" + 
        "Password=mypassword;" + 
        "Trusted_Connection=False;Encrypt=True;Connection Timeout=30";
    string azureSqlTableName = "dbo.mytable";

    string storageLinkedServiceName = "AzureStorageLinkedService";
    string sqlDbLinkedServiceName = "AzureSqlDbLinkedService";
    string blobDatasetName = "BlobDataset";
    string sqlDatasetName = "SqlDataset";
    string pipelineName = "Adfv2TutorialBlobToSqlCopy";

对此:

    // Specify the sink Azure SQL Database information
    string azureSqlConnString =
        "Server=tcp:mydb.database.windows.net,1433;" +
        "Database=mydb;" +
        "User ID=myuser;" + 
        "Password=mypassword;" + 
        "enableSkipIncompatibleRow= true;" + 
        "Trusted_Connection=False;Encrypt=True;Connection Timeout=30";
    string azureSqlTableName = "dbo.mytable";

    string storageLinkedServiceName = "AzureStorageLinkedService";
    string sqlDbLinkedServiceName = "AzureSqlDbLinkedService";
    string blobDatasetName = "BlobDataset";
    string sqlDatasetName = "SqlDataset";
    string pipelineName = "Adfv2TutorialBlobToSqlCopy";

作为猜测,但它没有用:

“留言”: “错误代码=用户错误无效DbConnectionString,'类型=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=无效 提供的数据库连接字符串。检查连接字符串 “下沉” side.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.ArgumentException,Message=关键字 不支持: 'enableskipincompatiblerow'.,Source=System.Data,'“,

有没有办法做到这一点?

class 的属性表示它获取或设置容错。我得到了接受属性的实现,但它似乎没有以所需的方式改变行为。SkipErrorFileCopyActivityCopyActivitySkipErrorFile = new SkipErrorFile { }

C# Azure SQL 数据库 azure-data-factory

评论

1赞 Tấn Nguyên 4/5/2020
我检查了复制活动类,它似乎不支持。我认为您可以在启动 CopyActivity 管道之前验证源数据集 (blob)。基本上,如果支持,它仍然会从应用程序中的库运行 validateenableSkipIncompatibleRow
0赞 Hack-R 4/5/2020
@TấnNguyên该属性听起来应该可以工作,但我尝试设置它没有达到预期的结果。learn.microsoft.com/en-us/dotnet/api/......SkipErrorFile
1赞 Hack-R 4/7/2020
我所做的解决方法是将所有内容加载到 1 列中(我使用了假分隔符),然后分析 SQL 和 Databricks 中的列,因为它太大了,无法在将其加载到 Blob 之前用我的笔记本电脑处理。
1赞 Tấn Nguyên 4/7/2020
是的,如果设备如此滞后,这也是一种方法。无论如何,恭喜!!

答:

0赞 Hack-R 4/5/2020 #1

我有一个解决方法,但不是真正的解决方案,所以我将自我回答,但不选择我的答案作为解决方案。

解决方法是创建一个假分隔符(数据中不存在的分隔符,例如 )和一个只有 1 列的 Azure SQL 接收器表。\t\t

从那里,我可以将数据加载到单个列中,并在数据进入 Azure SQL 后,使用 SQL 或 Databricks 中的任何语言(Python、R、Scala 或 SQL)对其进行分析,以便我可以使用 HPC 云环境大规模清理和分析数据。