【问题标题】:spark save taking lot of time火花节省花费大量时间
【发布时间】:2018-01-10 18:08:51
【问题描述】:

我有 2 个数据框,我想找到除 2 (surrogate_key,current) 之外所有列都相等的记录

然后我想用新的 surrogate_key 值保存这些记录。

以下是我的代码:

val seq = csvDataFrame.columns.toSeq
var exceptDF = csvDataFrame.except(csvDataFrame.as('a).join(table.as('b),seq).drop("surrogate_key","current"))
exceptDF.show()

exceptDF = exceptDF.withColumn("surrogate_key", makeSurrogate(csvDataFrame("name"), lit("ecc")))
exceptDF = exceptDF.withColumn("current", lit("Y"))

exceptDF.show()

exceptDF.write.option("driver","org.postgresql.Driver").mode(SaveMode.Append).jdbc(postgreSQLProp.getProperty("url"), tableName, postgreSQLProp)

这段代码给出了正确的结果,但是在将这些结果写入 postgre 时卡住了。

不确定是什么问题。还有什么更好的方法吗??

问候, 索拉布

【问题讨论】:

  • 写入 postgre 之前的 show() 也可以正确打印数据帧,但是写入需要太多时间。
  • show 不会对整个数据执行转换,它只需要显示多少数据(默认为 20)。您需要在写入 postgres 之前执行缓存 + 操作,然后您可以测量写入 postgres 实际花费的时间。此外,“大量时间”是一个非常广泛的描述,您拥有多少数据以及实际花费了多少时间......
  • 您好 Eliasah,我使用了 cache() + count(),仅 3 行 10 列大约需要 1/2 小时,而且延迟不是由于在 postgre 中写入。添加 count() 后,它的 count() 现在需要时间。
  • 这不包括节省时间的事实。
  • 那么您的整个管道需要进行分析...对于您提供的当前信息和代码,我们无法为您提供太多帮助

标签: apache-spark apache-spark-sql apache-spark-2.0


【解决方案1】:

默认情况下,spark-sql 创建 200 个分区,这意味着当您尝试保存 datafrmae 时,它​​将保存在 200 个 parquet 文件中。您可以使用以下技术减少 Dataframe 的分区数量。

  1. 在应用程序级别。设置参数“spark.sql.shuffle.partitions”如下:

sqlContext.setConf("spark.sql.shuffle.partitions", "10")

  1. 按如下方式减少特定 DataFrame 的分区数:

df.coalesce(10).write.save(...)

【讨论】:

  • 感谢 Neeraj,这有帮助..:)
【解决方案2】:

不建议对数据框使用var,您应该始终使用val,并在对数据框进行一些转换后创建一个新的数据框。

请删除所有var 并替换为val

希望这会有所帮助!

【讨论】:

  • 谢谢,香卡。即使将 var 更改为 val 后问题仍然存在。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2023-03-11
  • 2016-06-21
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多