避免在Datalake中重复分区

时间:2019-04-02 12:33:44

标签: apache-spark pyspark

当我编写实木复合地板文件Im传递列值之一作为分区时,但是当数据帧为空时,它不会创建分区(这是预期的),并且不执行任何操作。为了克服这个问题,如果我通过

df.partitionOf("department=One").write(df)

当数据框不为空时,它将创建两个级别的分区

location/department=One/department=One

如果分区已经存在,有什么办法可以跳过一个以避免重复?

1 个答案:

答案 0 :(得分:0)

编写数据帧时您要通过的路径是什么?我没有找到spark数据框的partitionOf函数。

我认为这应该适合您的情况

df.write.mode("append").partitionBy("department").parquet("location/")

如果您不想为已经存在的分区添加数据,请从现有镶木地板中找到partitons键,并使用这些分区键放置数据,然后以附加模式写入其余数据。

标量代码:

val dfi=spark.read.parquet(pathPrefix+finalFile).select(col("department"))
val finalDf = df.join(dfi, df.col("department") == dfi.col("department"), "left_outer")
                 .where(dfi.col("department").isNull())
                 .select(dfl.columns.map(col):_*)
finalDf.write.mode("append").partitionBy("department").parquet("location/")

您可以优化第一步(创建dfi),方法是从数据帧中查找分区键,并仅保留存在路径的那些分区键。