我正在使用Spark JDBC将数据摄入到MySQL表中。如果表不存在,它还创建了一个表。许多文本都有特殊字符。如果遇到任何特殊的字符,摄入失败。我通过将手动字符设置UTF8设置到MySQL表中解决了这个问题。
在spark jdbc中创建表格时,这是否可以设置CHARACTER SET utf8
?
我正在使用DataFrames将数据保存到MySQL中。
df.write
.format("jdbc")
.option("url", "jdbc:mysql://localhost")
.option("dbtable", "spark.tweet")
.option("user", "root")
.option("password", "root")
.mode(SaveMode.Append)
.save()
使用createTableOptions
选项,例如option("createTableOptions","CHARACTER SET utf8")
。
引用https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html:
createTableOptions 这是JDBC Writer相关的选项。如果指定,此选项允许在创建表格时设置数据库特定的表和分区选项(例如,创建表T(name string)引擎= innodb。)。此选项仅适用于写作。
实际上该字符由您访问MySQL数据库确定。因此,最好的方法是在JDBC URL中设置Charset:
jdbc:mysql://${jdbcHostname}:${jdbcPort}/${jdbcDatabase}?user=${jdbcUsername}&password=${jdbcPassword}&useUnicode=true&characterEncoding=UTF-8
也有类似的问题,我必须介绍两个主要更改:
- JDBC URL必须包含这2个:
&useUnicode=true&characterEncoding=UTF-8
- @jaceklaskowski提到的
createTableOptions
属性,即:.option("createTableOptions", "ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_unicode_ci"
我尝试过有和没有上述某些组合的不同组合,只使用适当的URL和可以将日语字符插入MySQL DB中的选项。我也在使用此驱动程序.option("driver", "com.mysql.jdbc.Driver")
,因为首先在没有此属性的情况下尝试时。
我的数据库具有另一个字符集,因此请注意,此配置仅为您的表更改。
火花版本为2.4。