我的 Azure Blob 存储中有这样的文件:
entity
|- part001.parquet
|- part002.parquet
|- part003.parquet
|- part004.parquet
...
这个 Parquet 数据有一个日期列,我们将其命名为 transaction_date
我想创建一个 Azure 数据工厂管道,将所有这些数据迁移到另一个 Blob 存储中,如下所示:
entity
|- YYYY
|-MM
|- entity_YYYYMMDD.parquet
...
|- YYYY
|-MM
|- entity_YYYYMMDD.parquet
...
因此,这些文件将仅包含基于 transaction_date
的特定日期交易,以便之后更容易选择它们。
有什么方法可以使用 ADF 或其他 Azure Stack 工具来执行此操作吗?
最佳答案
您追求的是动态分区或基于字段/列值的分区。
我们使用 Azure Databricks 来处理此类事情,如果需要重复,则通过 azure 数据工厂 v2 安排笔记本。在笔记本中,您可以有一个 pyspark 脚本,如下所示(请注意,此代码只是一个未经测试的模式)
extractData = spark.read.parquet("<<<input blob storage path>>>")
extractData = extractData\
.withColumn("transaction_year", year("transaction_date"))\
.withColumn("transaction_month", month("transaction_date"))
extractData.write.mode("overwrite") \
.partitionBy("transaction_year", "transaction_month") \
.parquet("<<<output blob storage path>>>")
我们可以只使用 Azure 数据工厂吗?假设您使用的是 Azure 数据工厂 v2 - 与上面相比,很难(并非不可能)基于字段值进行分区。
话虽如此,Azure 数据工厂映射数据流有公共(public)预览版 - 在幕后它使用 Azure Databricks 进行计算。我还没有测试/或玩过,也许你可以使用类似 conditional split 的转换事件。但使用 Databricks 也很简单。
关于按日期的 Azure Blob 复制分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55464883/