使用spark原生的save()方式存储MySQL表会出现以下问题。
1.如果用overwrite存储方式,会把mysql中要存储的表删除掉,新建一张表。于是出现了每个字符类型为Longtext类型,并且没有主键,这显然是不符合要求的。
所以写了以下spark存储jdbc的代码。读取mysql表方法为spark原生load(),读取完后,将会成为一张dataframe表格。此时再使用jdbc提供的方法进行存储。
注意点:获取dataframe中的每一条数据,需要用Object类型来存储。否则在插入数据时可能会出现类型转换问题。
val v = row.getValuesMap[Object](cols).values.toBuffer
statement.setObject(i+1,v.apply(i))
针对mysql现有模式为overwrite,append,upsert
整体架构
package com.mas.bgdt.dmp.framework.handler.impl
import java.sql.{DriverManager, SQLException, ResultSet}
import org.apache.spark.sql.DataFrame
import com.mas.bgdt.dmp.framework.handler.model.Connection
object JdbcHandler {
//update
def update(connection: Connection, sql: String) = {
val conn = getConnection(connection)
conn.prepareStatement(sql).executeUpdate()
//conn.close()
}
//read source为jdbc:mysql://192.168.10.1:330