【问题标题】:Azure blob copy partition by date按日期划分的 Azure Blob 复制分区
【发布时间】:2019-04-01 23:23:23
【问题描述】:

我在 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 parquet azure-data-factory azure-blob-storage


    【解决方案1】:

    你所追求的是动态分区或基于字段/列值的分区。

    我们使用 Azure Databricks 来处理此类事情,如果需要重复执行,则通过 azure data factory 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 数据工厂映射数据流有公开预览版 - 在幕后,它使用 Azure Databricks 进行计算。我没有测试/或玩过可能你可以使用像conditional split 这样的转换活动。但是再次使用 Databricks 很简单。

    【讨论】:

    • 谢谢@databash,刚刚在这里使用了你的脚本,在输出中我得到了奇怪的文件夹名称,比如 year=YYYY,month=MM... 你就这样吗?有没有办法像问题层次一样写?
    • 不幸的是,这就是 apache spark 分区的方式。 “年”和“月”二字随之而来。我们无法定制您需要的方式。在下游阅读该文件夹时,您需要处理它。
    猜你喜欢
    • 2016-08-12
    • 2012-04-07
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多