我们在缓存/数据库中有一些业务数据。我们每天处理大量的日志数据并更新我们的数据缓存/数据库。其中一些更新几乎是实时发生的,一些是批量发生的。我们有很多改造的火花工作。我们将来自spark作业的结果存储在文本文件中,然后运行另一个顺序作业将它们放入我们的缓存/ DB中。
我考虑过使用连接器(mongoDB-spark连接器,redis-spark连接器),并将整个数据作为RDD并对其进行处理。但是,我们的业务数据大小与日志文件和我们所做的每日更新相比非常大。所以,放弃它。
问题:
答案 0 :(得分:0)
如果您对数据库的写入很简单,您可以使用以下命令直接写入数据库:
myDF.write
.mode("overwrite") // Choose the mode you want from org.apache.spark.sql.SaveMode
.jdbc(url, "my_table", props)
如果查询不仅仅是一个简单的插入(例如我的查询中有on duplicate key update
部分的查询),您需要自己完成。
您可以使用mapPartitions()
在分区之间分发文字。
myDF.mapPartitions(rows => {
val connection = DriverManager.getConnection(URL, properties)
rows.foreach(bulk => {
val statement = connection.prepareStatement(myQuery)
bulk.foreach(row => {
statement.setString(1, row.getString(0))
statement.setInt(2, row.getInt(1))
...
statement.addBatch()
})
statement.executeLargeBatch().iterator
})
rows
}).count //An action here is required, to trigger the mapPartitions()