我有一个使用jdbc创建的数据框列表。有没有办法用木地板并行编写它们?
val listOfTableNameAndDf = for {
table <- tableNames
} yield (table, sqlContext.read.jdbc(jdbcUrl, table, new Properties))
我可以按顺序编写它们,但有没有办法并行化写入或使其更快。
listOfTableNameAndDf.map { x => {
x._2.write.mode(org.apache.spark.sql.SaveMode.Overwrite).parquet(getStatingDir(x._1))
}
}
答案 0 :(得分:2)
您可以在将来异步执行写入操作:
dfs.map { case (name, table) =>
Future(table.write.mode("overwrite").parquet(getStatingDir("name")))
}
但我怀疑它会带来任何重大改进。如果像你的那样有几个主要瓶颈:
如果每个作业的源和输出相同,则作业将竞争同一组资源,并且顺序执行驱动程序代码几乎不会成为问题。
如果您正在寻找当前代码的改进,我建议您首先使用带有以下签名的reader方法:
jdbc(url: String, table: String, columnName: String,
lowerBound: Long, upperBound: Long, numPartitions: Int,
connectionProperties: Properties)
它需要更多的工作量,但通常表现出更好的性能,因为读取(以及因此数据)在工作节点之间分配。