如何在 AWS Glue 中按日期时间对数据进行分区?

use*_*287 1 etl amazon-web-services aws-glue aws-glue-data-catalog

目前的设置:

  • 带有 json 文件的 S3 位置。所有文件存储在同一位置(无日/月/年结构)。

  • Glue Crawler 读取目录表中的数据

  • Glue ETL 作业将数据转换并存储到 s3 中的镶木地板表中
  • Glue Crawler 从 s3 parquet 表中读取并存储到 Athena 查询的新表中

我想要实现的是按天 (1) 分区的镶木地板表和 1 天的镶木地板表在同一个文件 (2) 中。目前,每个 json 文件都有一个镶木地板表。

我该怎么办?

值得一提的是,数据中有一个 datetime 列,但它是一个 unix 纪元时间戳。我可能需要将其转换为“年/月/日”格式,否则我假设它会再次为每个文件创建一个分区。

非常感谢你的帮助!!

Yur*_*ruk 7

将Glue的DynamicFrame转化为Spark的DataFrame,添加年/月/日列并重新分区。将分区减少到一个将确保只有一个文件会被写入一个文件夹,但这可能会降低作业性能。

这是python代码:

from pyspark.sql.functions import col,year,month,dayofmonth,to_date,from_unixtime

...

df = dynamicFrameSrc.toDF()

repartitioned_with_new_columns_df = df
    .withColumn(“date_col”, to_date(from_unixtime(col(“unix_time_col”))))
    .withColumn(“year”, year(col(“date_col”)))
    .withColumn(“month”, month(col(“date_col”)))
    .withColumn(“day”, dayofmonth(col(“date_col”)))
    .drop(col(“date_col”))
    .repartition(1)

dyf = DynamicFrame.fromDF(repartitioned_with_new_columns_df, glueContext, "enriched")

datasink = glueContext.write_dynamic_frame.from_options(
    frame = dyf, 
    connection_type = "s3", 
    connection_options = {
        "path": "s3://yourbucket/data”, 
        "partitionKeys": [“year”, “month”, “day”]
    }, 
    format = “parquet”, 
    transformation_ctx = "datasink"
)
Run Code Online (Sandbox Code Playgroud)

请注意,from pyspark.qsl.functions import col可以给出参考错误,这不应该是这里解释的问题

  • @user2642287 请立即尝试,我已经更新了代码以使用 `col` 函数 (2认同)
  • 函数年、月和日的返回值为整数(请参阅https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/functions.html) (2认同)
  • @MaltMaster 每个分区仅生成一个文件 (2认同)