当我编写实木复合地板文件Im传递列值之一作为分区时,但是当数据帧为空时,它不会创建分区(这是预期的),并且不执行任何操作。为了克服这个问题,如果我通过
df.partitionOf("department=One").write(df)
当数据框不为空时,它将创建两个级别的分区
location/department=One/department=One
如果分区已经存在,有什么办法可以跳过一个以避免重复?
答案 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),方法是从数据帧中查找分区键,并仅保留存在路径的那些分区键。