我们正在构建快速应用/快速解决方案,需要将每月CSV文件从内部部署存储(即)文件加载到Azure blob / SQL表中。有4个文件,每个文件有50000行,月份名称贴在文件名中。
将这些文件传输到blob或存储中的最有名的方法是什么,同时确保我们能够以某种方式从文件中检索月份名称,忽略内部部署文件夹上的旧文件,并且只加载新文件。
过去,我们可以使用SSIS轻松支持此行为,但我正在寻找基于云的解决方案,例如Data Factory。
我已尝试过On-Premise到Azure Blob,但我无法避免传输旧文件,也无法检索文件名(尽管我可以使用插入/修改日期)。
有什么建议吗?想法?
谢谢,
答案 0 :(得分:2)
几周前我有同样的需求,我决定寻求使用Azure功能和本机Azure SQL BULK功能的解决方案。
只要将文件复制到Blob Store(https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob),就可以触发Azure功能。您可以访问所有文件属性,也可以访问文件名。
Azure Function将在Azure SQL中调用一个过程,传递检测到的CSV文件名,以便将其批量导入到您选择的表中,以及所有需要的属性。
此处提供完整的代码示例和详细说明:
答案 1 :(得分:1)
您可以使用任何上传到Storage Blob或Azure Data Lake Store(可能使用ADF编排)并保留文件名结构。
然后,您可以使用Azure Data Lake Analytics和U-SQL使用EXTRACT
和OUTPUT
语句将文件转换为CSV文件,您可以使用所谓的文件集语法来转动文件/文件夹名称放入行集并使用谓词来限制要处理的文件范围。可以通过ADF再次编排和参数化该U-SQL作业。然后最后使用ADF将生成的文件移动到SQL Azure,或者如果使用SQL DW,则可以在生成的CSV上使用Polybase。
以下是伪U-SQL脚本的一个简单示例:
DECLARE EXTERNAL @begin_date = DateTime.Parse("2017-06-01");
DECLARE EXTERNAL @end_date = DateTime.Parse("2017-06-08");
@data = EXTRACT col1 int, col2 string, date DateTime
FROM "/path/file_{date:yyyy}_{date:MM}_{date:dd}.csv"
USING Extractors.Csv();
@data = SELECT * FROM @data WHERE date BETWEEN @begin_date AND @end_date;
OUTPUT @data TO "/output/cookeddata.csv" USING Outputters.Csv();