使用 Azure 数据工厂将文件内容从 Azure 存储复制到 Azure SQL Db
Copying file contents from Azure Storage to Azure SQL Db using Azure Data Factory
第一次发帖,好久了reader。
第三方提供商每天将 CSV 文件上传到共享的 Azure Blob 存储。这些文件在文件名中有一个带有时间戳的特定前缀,并且位于同一目录中。 F.i。 "dw_palkkatekijat_20170320T021" 每个文件都将包含前一个文件的所有数据,以及前一天新添加的数据。我想将所有文件中的所有行导入 Azure SQL 数据库中的 SQL table。这个我可以做到。
我遇到的问题是我不知道如何将文件名添加到 table 中的单独列中,因此我可以将行来自哪个文件,并且只使用最新的行.我需要导入所有文件的内容并存储所有 "versions" 个文件。有没有办法将文件名作为 SQL 存储过程的参数发送?或者有其他方法可以解决这个问题?
感谢您的帮助。
在您描述的当前情况下,您将无法获得准确的文件名。 ADF 不是数据转换服务,因此不会为您提供这种级别的功能......我希望它能!
但是,有几个选项可以用来获取文件名或类似的东西。 None我接受是完美的!
选项 1(我认为是最佳选项!)
正如你所问。将参数传递给 SQL 数据库存储过程。这当然可以使用 ADF activity 参数属性。
传递什么作为参数?...
好吧,如果 blob 存储中的源文件在文件名中有明确定义的日期和时间。这是您已经在输入数据集定义中使用的内容,然后将其传递给 proc。将其存储在 SQL DB table 中。然后你可以计算出文件何时加载以及加载时间和重叠时间。也许?
您可以在 activity 中访问数据集的时间片开始。示例 JSON...
"activities": [
{
"name": "StoredProcedureActivityTemplate",
"type": "SqlServerStoredProcedure",
"inputs": [
{
"name": "BlobFile"
}
],
"outputs": [
{
"name": "RelationalTable"
}
],
"typeProperties": {
"storedProcedureName": "[dbo].[usp_LoadMyBlobs]",
"storedProcedureParameters": {
//like this:
"ExactParamName": "$$Text.Format('{0:yyyyMMdd}', Time.AddMinutes(SliceStart, 0))" //tweak the date format
}
}, //etc ....
选项 2(大量工作)
自己创建一个中间人 ADF 自定义 activity 读取文件,加上文件名并将值添加为列。
ADF 中的自定义活动基本上为您提供了执行任何操作的可扩展性,因为您必须在 C# 中设计数据转换行为。
如果您想走这条路,我建议您了解使用自定义活动涉及的内容。需要更多的努力和 Azure Batch 服务。
选项 3(完全矫枉过正)
使用 Azure Data Lake Analytics 服务!采用与选项 2 相同的方法。在数据湖中使用 USQL 来解析文件并将文件名包含在输出数据集中。在 USQL 中,您可以传递文件名的通配符作为提取器的一部分,并在输出数据集中使用它。
我将此选项标记为矫枉过正,因为仅仅为了读取文件名而依赖完整的数据湖服务是过度的。实际上,数据湖可能会取代您的 SQL 数据库层,并免费为您提供文件名转换。
顺便说一下,您不需要使用 Azure Data Lake 存储来存储您的源文件。您可以授予分析服务对现有共享 blob 存储帐户的访问权限。但是您只需要它来支持分析服务。
选项 4
重新考虑并使用 Azure Data Lake 而不是 Azure SQL DB?????
希望对您有所帮助
第一次发帖,好久了reader。
第三方提供商每天将 CSV 文件上传到共享的 Azure Blob 存储。这些文件在文件名中有一个带有时间戳的特定前缀,并且位于同一目录中。 F.i。 "dw_palkkatekijat_20170320T021" 每个文件都将包含前一个文件的所有数据,以及前一天新添加的数据。我想将所有文件中的所有行导入 Azure SQL 数据库中的 SQL table。这个我可以做到。
我遇到的问题是我不知道如何将文件名添加到 table 中的单独列中,因此我可以将行来自哪个文件,并且只使用最新的行.我需要导入所有文件的内容并存储所有 "versions" 个文件。有没有办法将文件名作为 SQL 存储过程的参数发送?或者有其他方法可以解决这个问题?
感谢您的帮助。
在您描述的当前情况下,您将无法获得准确的文件名。 ADF 不是数据转换服务,因此不会为您提供这种级别的功能......我希望它能!
但是,有几个选项可以用来获取文件名或类似的东西。 None我接受是完美的!
选项 1(我认为是最佳选项!)
正如你所问。将参数传递给 SQL 数据库存储过程。这当然可以使用 ADF activity 参数属性。
传递什么作为参数?...
好吧,如果 blob 存储中的源文件在文件名中有明确定义的日期和时间。这是您已经在输入数据集定义中使用的内容,然后将其传递给 proc。将其存储在 SQL DB table 中。然后你可以计算出文件何时加载以及加载时间和重叠时间。也许?
您可以在 activity 中访问数据集的时间片开始。示例 JSON...
"activities": [
{
"name": "StoredProcedureActivityTemplate",
"type": "SqlServerStoredProcedure",
"inputs": [
{
"name": "BlobFile"
}
],
"outputs": [
{
"name": "RelationalTable"
}
],
"typeProperties": {
"storedProcedureName": "[dbo].[usp_LoadMyBlobs]",
"storedProcedureParameters": {
//like this:
"ExactParamName": "$$Text.Format('{0:yyyyMMdd}', Time.AddMinutes(SliceStart, 0))" //tweak the date format
}
}, //etc ....
选项 2(大量工作)
自己创建一个中间人 ADF 自定义 activity 读取文件,加上文件名并将值添加为列。
ADF 中的自定义活动基本上为您提供了执行任何操作的可扩展性,因为您必须在 C# 中设计数据转换行为。
如果您想走这条路,我建议您了解使用自定义活动涉及的内容。需要更多的努力和 Azure Batch 服务。
选项 3(完全矫枉过正)
使用 Azure Data Lake Analytics 服务!采用与选项 2 相同的方法。在数据湖中使用 USQL 来解析文件并将文件名包含在输出数据集中。在 USQL 中,您可以传递文件名的通配符作为提取器的一部分,并在输出数据集中使用它。
我将此选项标记为矫枉过正,因为仅仅为了读取文件名而依赖完整的数据湖服务是过度的。实际上,数据湖可能会取代您的 SQL 数据库层,并免费为您提供文件名转换。
顺便说一下,您不需要使用 Azure Data Lake 存储来存储您的源文件。您可以授予分析服务对现有共享 blob 存储帐户的访问权限。但是您只需要它来支持分析服务。
选项 4
重新考虑并使用 Azure Data Lake 而不是 Azure SQL DB?????
希望对您有所帮助