Spark JDBC Overwrite模式支持truncate

最近使用spark jdbc写关系库数据库 用的是Overwrite模式,发现字段类型被重建为 TEXT。

为了使Spark不修改表原本的类型,我们让Overwrite操作采用truncate table的方式而不是重建表

查看官方文档后看到 truncate 属性

image

在options中设置了truncate属性后 发现仍未解决问题

代码如下:


val options = Map(
"url" -> url,
"driver" -> driverClass,
"user" -> user,
"password" -> password,
"dbtable" -> tableName,
"truncate" -> "true")
df.write.mode(SaveMode.Overwrite).format("jdbc").options(options).save()

查看源码:

image.png

isTruncate就是我们配置的truncate属性了
后面的isCascadingTruncateTable(url) 是判断数据库是否支持truncate操作。

继续看:

image.png

image.png

原来是在这里根据url 来匹配Spark适配的JdbcDialect
而Spark并未适配我们使用的informix数据库 所以truncate属性并不生效

解决方案:

1、适配informix数据库

object InformixDialect extends JdbcDialect {

    override def canHandle(url:String):Boolean = url.startsWith("jdbc:informix")

    override def isCascadingTruncateTable(): Option[Boolean] =Some(false)

    override def getJDBCType(dt: DataType): Option[JdbcType] = dt match {

    case StringType =>Option(JdbcType("VARCHAR(128)", java.sql.Types.VARCHAR))
    }
}

canHandle: 适配jdbc url

isCascadingTruncateTable: 支持truncate操作,这里需要设置为false 才支持truncat。⊙Д⊙

getJDBCType: 映射jdbcType 和 sqlType 用来支持建表操作

2、注册方言

JdbcDialects.registerDialect(InformixDialect)

3、写库


val options = Map(

"url" -> url,

"driver" -> driverClass,

"user" -> user,

"password" -> password,

"dbtable" -> tableName,

"truncate" -> "true")

df.write.mode(SaveMode.Overwrite).format("jdbc").options(options).save()

成功写入 并不会对表字段产生影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容