当前设置:
带有json文件的S3位置。所有文件都存储在同一位置(无日/月/年结构)。
Glue Crawler读取目录表中的数据
我要实现的是将实木复合地板表按天(1)分区,并将1天的实木复合地板表放在同一文件(2)中。当前每个json文件都有一个实木复合地板表。
我该怎么办?
要提到的一件事,数据中有datetime列,但这是unix纪元时间戳。我可能需要将其转换为“年/月/日”格式,否则我假设它将再次为每个文件创建一个分区。
非常感谢您的帮助!
答案 0 :(得分:2)
将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"
)
答案 1 :(得分:1)
要在 AWS Glue Studio 中实现这一点:
您需要创建一个自定义函数来将日期时间字段转换为日期。还有一个额外的步骤是将其转换回 DynamicFrameCollection。
在 Python 中:
def MyTransform(glueContext, dfc) -> DynamicFrameCollection:
df = dfc.select(list(dfc.keys())[0]).toDF()
df_with_date = df.withColumn('date_field', df['datetime_field'].cast('date'))
glue_df = DynamicFrame.fromDF(df_with_date, glueContext, "transform_date")
return(DynamicFrameCollection({"CustomTransform0": glue_df}, glueContext))
然后您必须编辑自定义转换器架构以包含您刚刚创建的新日期字段。
然后您可以使用“数据目标”节点将数据写入磁盘,然后选择新的日期字段用作分区。
答案 2 :(得分:0)
我无法发表评论,所以我要写一个答案。
我使用了Yuriy的代码,需要调整一些内容:
df = dynamicFrameSrc.toDF()
select("*")
,否则架构为空 df.select("*")
.withColumn(“date_col”, to_date(from_unixtime(col(“unix_time_col”))))