【问题标题】:How to set CHARACTER SET for writing to MySQL table using JDBC data source?如何设置 CHARACTER SET 以使用 JDBC 数据源写入 MySQL 表?
【发布时间】:2019-05-18 20:55:53
【问题描述】:

我正在使用 Spark JDBC 将数据摄取到 Mysql 表中。如果表不存在,它也会创建一个表。许多文本都有特殊字符。如果遇到任何特殊字符,摄取将失败。我通过手动将 CHARACTER SET 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()

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    使用createTableOptions 选项,例如option("createTableOptions","CHARACTER SET utf8").

    引用https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html:

    createTableOptions 这是一个与 JDBC 编写器相关的选项。如果指定,此选项允许在创建表时设置特定于数据库的表和分区选项(例如,CREATE TABLE t (name string) ENGINE=InnoDB.)。此选项仅适用于写作。

    【讨论】:

    • 你知道如何设置SET NAMES utf8mb4,谢谢。
    • @roamer 不知道,但会从这个createTableOptions 选项开始。你试过了吗?
    【解决方案2】:

    实际上,字符集是由您对 MySQL 数据库的访问决定的。所以最好的方法是在 jdbc url 中设置字符集,如下所示:

    jdbc:mysql://${jdbcHostname}:${jdbcPort}/${jdbcDatabase}?user=${jdbcUsername}&password=${jdbcPassword}&useUnicode=true&characterEncoding=UTF-8
    

    【讨论】:

    • 已经试过了。它不会使用 CHARACTER SET utf8 创建表。
    • 赞成这个,因为它是答案的一部分。见下文
    【解决方案3】:

    遇到了类似的问题,我必须介绍两个主要更改:

    1. jdbc url 必须包含这两个:&useUnicode=true&characterEncoding=UTF-8
    2. @JacekLaskowski 提到的createTableOptions 属性,即:.option("createTableOptions", "ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_unicode_ci"

    我尝试了不同的组合,有和没有上面的一些,并且只使用正确的 url 和我可以在我的 MySql 数据库中插入我的日文字符的选项。我也在使用这个驱动程序.option("driver", "com.mysql.jdbc.Driver"),因为第一次尝试没有这个属性时它会抱怨。

    我的数据库有另一个字符集,因此请注意此配置仅针对您的表进行更改。

    Spark 版本是 2.4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 2011-01-29
      • 2013-12-01
      • 2011-05-22
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多