火花节省了大量的时间

时间:2017-08-03 08:40:16

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

我有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时卡住了。

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

此致 Sorabh

2 个答案:

答案 0 :(得分:3)

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

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

    sqlContext.setConf(“spark.sql.shuffle.partitions”,“10”)

  2. 减少特定DataFrame的分区数量,如下所示:

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

  3. 希望它有所帮助。

    此致

    Neeraj

答案 1 :(得分:0)

不建议在数据框中使用var,在数据框中执行某些转换后,应始终使用val并创建新的Dataframe。

请删除所有var并替换为val

希望这有帮助!