按列进行分区

时间:2018-09-25 19:31:27

标签: apache-spark partitioning parquet

我有一个由事件组成的大型数据集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)不一定会导致每个列集有一个分区。

1 个答案:

答案 0 :(得分:0)

我仍然不清楚引擎盖下到底发生了什么,但事实证明您只是

df.repartition(1, col("year"), col("month"), col("day"), col("event_hour"))

有趣的是,这比repartition(...).coalesce快得多,尤其是在使用S3时,确保文件数量最少绝对重要。