我正在按照this tutorial从Blob中的平面文件加载Azure SQL中的数据。
此方法需要C#.NET Framework控制台应用程序来创建/管理Blob数据集,Azure SQL接收器和数据工厂。
唯一的问题是,对于大而凌乱的数据文件,我不可避免地会遇到一些行,这些行包含一个额外的定界符或以其他方式畸形。数据太大,无法在上载到Blob之前在本地清除。
通常的解决方案是忽略不良行,即忽略allow fault tolerance。
有一个使用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";
作为猜测,但是没有用:
“消息”:“ ErrorCode = UserErrorInvalidDbConnectionString,'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message =无效提供的数据库连接字符串。检查连接字符串在'下沉'侧面。,Source = Microsoft.DataTransfer.ClientLibrary,''Type = System.ArgumentException,Message =关键字不支持:'enableskipincompatiblerow'。,Source = System.Data,'“,
有没有办法做到这一点?
事实证明,用于管理启用容错的needed property被称为SkipErrorFile
,需要将其添加到CopyActivity
的代码中。
经过一段时间的迭代,我发现当我进行更改时:
new CopyActivity
{
Name = "CopyFromBlobToSQL",
Inputs = new List<DatasetReference>
{
new DatasetReference() { ReferenceName = blobDatasetName }
},
Outputs = new List<DatasetReference>
{
new DatasetReference { ReferenceName = sqlDatasetName }
},
Source = new BlobSource { },
Sink = new SqlSink { }
}
}
至此:
new CopyActivity
{
Name = "CopyFromBlobToSQL",
Inputs = new List<DatasetReference>
{
new DatasetReference() { ReferenceName = blobDatasetName }
},
Outputs = new List<DatasetReference>
{
new DatasetReference { ReferenceName = sqlDatasetName }
},
Source = new BlobSource { },
Sink = new SqlSink { }
,SkipErrorFile = new SkipErrorFile { } // added this
}
它能够在相同(以前有问题的)文件上生成并运行而没有错误。