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()

成功寫入 并不會對表字段產生影響。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容