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

C# 通过C.NET Framework托管数据工厂将数据从Blob复制到Azure SQL时忽略坏行,c#,azure,azure-sql-database,azure-data-factory-2,C#,Azure,Azure Sql Database,Azure Data Factory 2,我下面是从Blob中的平面文件加载Azure SQL中的数据 此方法需要C.NET Framework控制台应用程序来创建/管理Blob数据集、Azure SQL接收器和数据工厂 唯一的问题是,对于大而杂乱的数据文件,我不可避免地会遇到一些行,这些行包含额外的分隔符,或者在其他方面格式不正确。数据太大,无法在上载到blob之前在本地清理 通常的解决方案是忽略坏行,即 下面是一个如何使用JSON执行此操作的示例: "typeProperties": { "source": {

我下面是从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"
     }
}
为此:

    // 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";
作为猜测,但它不起作用:

信息: ErrorCode=UserErrorInvalidDbConnectionString,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Invalid 提供了数据库连接字符串。检查位于的连接字符串 “水槽” side.,Source=Microsoft.DataTransfer.ClientLibrary,Type=System.ArgumentException,Message=Keyword 不支持:“EnableSkipCompatibleRow.”,Source=System.Data,'

有办法做到这一点吗


CopyActivity类的SkipPerrorFile表示它获取或设置容错。我让CopyActivity实现接受SkipErrorFile=new SkipErrorFile{}属性,但它似乎没有以所需的方式更改行为。

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

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


从那里,我可以将数据加载到一个列中,在它进入Azure SQL之后,使用SQL或Databricks Python、R、Scala或SQL中的任何语言对其进行解析,这样我就可以使用HPC云环境大规模清理和解析数据。

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

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


从那里,我可以将数据加载到一个列中,在它进入Azure SQL之后,使用SQL或Databricks Python、R、Scala或SQL中的任何语言对其进行解析,这样我就可以使用HPC云环境按比例清理和解析数据。

我选中了Copy Activity类,它似乎不支持EnableSkipCompatibleRow。我认为您可以在启动CopyActivity管道之前验证源数据集blob。基本上,它仍然从应用程序中的库中运行validate,如果supported@TấnNguyên属性skipperrorfile听起来应该可以工作,但我试图设置它却没有达到预期的效果。我所做的解决方法是将所有内容加载到一列中,我使用了一个假分隔符,然后在SQL和Databricks中解析这些列,因为在加载到blob之前,它太大了,无法使用我的笔记本电脑。是的,如果设备太落后,这也是一种方法。不管怎样,祝贺你!!我检查了复制活动类,它似乎不支持EnableSkipCompatibleRow。我认为您可以在启动CopyActivity管道之前验证源数据集blob。基本上,它仍然从应用程序中的库中运行validate,如果supported@TấnNguyên属性skipperrorfile听起来应该可以工作,但我试图设置它却没有达到预期的效果。我所做的解决方法是将所有内容加载到一列中,我使用了一个假分隔符,然后在SQL和Databricks中解析这些列,因为在加载到blob之前,它太大了,无法使用我的笔记本电脑。是的,如果设备太落后,这也是一种方法。不管怎样,祝贺你!!
    // 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";