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