我有一个由事件组成的大型数据集df
。我想写出来,按年/月/日/小时进行分区,并使每个分区只包含文件。
这是一个代码段:
df.partitionBy("event_year", "event_month", "event_day", "event_hour").
mode(SaveMode.Overwrite).
parquet(s"${output_data_root}/tmp/")
目前尚不清楚在执行此操作之前如何处理df
,以便取出一个文件,因为尚不清楚partition(COL)
和coalesce
是如何相互作用的。 IE,当我这样做时会发生什么:
df.repartition(col("year"), col("month"), col("day"), col("event_hour")).coalesce(1)
(反之亦然)
仅coalesce(1)
(数据集太大)是行不通的,但是据我所知,repartition(COL)
不一定会导致每个列集有一个分区。
答案 0 :(得分:0)
我仍然不清楚引擎盖下到底发生了什么,但事实证明您只是
df.repartition(1, col("year"), col("month"), col("day"), col("event_hour"))
有趣的是,这比repartition(...).coalesce
快得多,尤其是在使用S3时,确保文件数量最少绝对重要。