【问题标题】:spark df.write.partitionBy run very slowspark df.write.partitionBy 运行很慢
【发布时间】:2019-01-22 18:58:35
【问题描述】:

我有一个数据框,当保存为 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)

【问题讨论】:

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


    【解决方案1】:

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

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

    它应该会加快您的查询速度。

    【讨论】:

    • 谢谢!!!那行得通,我只需要在前一天用 $ 符号来做:.repartition($"day")
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多