![](/img/trans.png)
[英]Copying data incrementally (delta data) from an API endpoint by HTTP GET to an Azure SQL DB on Azure Data Factory
[英]Copying file contents from Azure Storage to Azure SQL Db using Azure Data Factory
第一次海报,长时间阅读。
第三方提供商每天将CSV文件上载到共享Azure Blob存储一次。 这些文件具有一定的前缀,文件名中包含时间戳,并且位于同一目录中。 Fi“dw_palkkatekijat_20170320T021”每个文件都将包含之前的所有数据,以及前一天新添加的数据。 我想将所有文件中的所有行导入Azure SQL DB中的SQL表。 我能这样做。
我遇到的问题是我不知道如何将文件名添加到表中的单独列中,因此我可以分隔行来自哪个文件,并且只使用最新的行。 我需要导入所有文件的内容并存储文件的所有“版本”。 有没有办法可以将文件名作为SQL存储过程的参数发送? 或者任何其他方式来处理这个问题?
谢谢您的帮助。
在您描述的当前情况下,您将无法获得确切的文件名。 ADF不是数据转换服务,因此不会为您提供此级别的功能......我希望它能做到!
但是,有几个选项可以获取文件名或类似的东西。 我接受的都不是完美的!
选项1 (我认为最佳选择!)
正如你问的那样。 将参数传递给SQL DB存储过程。 使用ADF活动参数属性当然可以实现这一点。
作为一个参数传递什么?...
好吧,如果blob存储中的源文件在文件名中有明确定义的日期和时间。 您已在输入数据集定义中使用了哪个,然后将其传递给proc。 将其存储在SQL DB表中。 然后你可以在文件加载时以及何时和重叠期间计算出来。 也许?
您可以访问活动中数据集的时间片开始。 示例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自定义活动,读取文件,加上文件名,并将值添加为列。
ADF中的自定义活动基本上为您提供了可扩展性,因为您必须在C#中创建数据转换行为。
如果你想沿着这条路走下去,我会建议你学习使用自定义活动所涉及的内容。 需要付出更多努力,并且需要Azure批处理服务。
选项3 (总矫枉过正)
使用Azure Data Lake Analytics服务! 采用与选项2相同的方法。在数据湖中使用USQL来解析文件并在输出数据集中包含文件名。 在USQL中,您可以将文件名的通配符作为提取程序的一部分传递,并在输出数据集中使用它。
我认为这个选项太过分了,因为在完整的数据湖服务上进行抽薹只是为了读取文件名是过分的。 实际上,数据湖可能会取代您的SQL数据库层,并免费为您提供文件名转换。
顺便说一句,您不需要使用Azure Data Lake存储来存储源文件。 您可以为分析服务提供对现有共享Blob存储帐户的访问权限。 但是,您只需要它来支持分析服务。
选项4
重新考虑并使用Azure Data Lake而不是Azure SQL DB ?????
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.