spark df.write.partitionBy运行速度很慢

时间:2017-07-23 20:31:48

标签: scala apache-spark apache-spark-sql spark-dataframe

我有一个数据框,当保存为Parquet格式时需要大约11GB。 读取数据帧并写入json时,需要5分钟。 当我添加partitionBy(“day”)时,需要几个小时才能完成。 我知道分配给分区是一项代价高昂的行动。 有没有办法让它更快?排序文件会使它更好吗?

示例:

运行5分钟

df=spark.read.parquet(source_path).
df.write.json(output_path)

运行数小时

spark.read.parquet(source_path).createOrReplaceTempView("source_table")
sql="""
select cast(trunc(date,'yyyymmdd') as int) as day, a.*
from source_table a"""
spark.sql(sql).write.partitionBy("day").json(output_path)

2 个答案:

答案 0 :(得分:6)

尝试在repartition("day")之前添加write,如下所示:

spark
  .sql(sql)
  .repartition("day")
  .write
  .partitionBy("day")
  .json(output_path)

它应该加快你的查询速度。

答案 1 :(得分:1)

尝试添加重新分区(任意数字)开始,然后根据写入时间尝试增加/减少数量

 spark
  .sql(sql)
  .repartition(any number)
  .write
  .partitionBy("day")
  .json(output_path)