可以在 Spark 中写入 MEDIUMTEXT 类型的 MySQL 列吗?

Posted

技术标签:

【中文标题】可以在 Spark 中写入 MEDIUMTEXT 类型的 MySQL 列吗?【英文标题】:It is possible to write to MySQL columns of type MEDIUMTEXT in Spark? 【发布时间】:2019-08-08 07:44:27 【问题描述】:

我正在使用 Spark SQL 从 mysql 表中读取数据框,其中列的类型为 MEDIUMTEXT。当我将数据框写入未修改的新表时,该列现在具有 TEXT 类型,并且我得到了 MySQL MysqlDataTruncation 异常。

我不知道是我运气不好还是有什么方法可以通知 Spark SQL 所需的 MySQL 特定结果列类型是什么。

这里有人知道这个问题吗?

【问题讨论】:

你用的是什么版本的 MySQL? 我使用的是 MySQL 5.7 和 Spark 2.4.3。 我问这个是因为this answer。这可能是一个 unicode 问题。 有趣 - 谢谢,之前没看到。我只是尝试对 MySQL 8.0 运行读写,但问题仍然出现。另外,如果它是 unicode,我会感到惊讶,因为要写入的所有数据都来自类似的 MySQL 服务器。 我假设您意识到MEDIUMTEXT(16,777,215 个字符)比TEXT(65,535 个字符)大得多。也许你没有?请参阅:dev.mysql.com/doc/refman/5.5/en/string-type-overview.html 只需测试文本列的最大长度,看看是否有问题。 【参考方案1】:

您可以使用createTableColumnTypes 自定义列类型,而不是 SparkSQL 中的默认值。

当然,你不能直接使用MEDIUMTEXT/LONGTEXT,如果你写这样的代码:

// Saving data to a JDBC source
// Suppose column "name" is the column which you want to write as type MEDIUMTEXT
jdbcDF.write
  .option("createTableColumnTypes", "name MEDIUMTEXT")
  .jdbc("jdbc://...", "xxx tablename", ...)

也许你会得到这样的异常:

org.apache.spark.sql.catalyst.parser.ParseException: 
DataType MEDIUMTEXT is not supported.(line 1, pos 12)

== SQL ==
name MEDIUMTEXT
-----^^^

        at org.apache.spark.sql.catalyst.parser.AstBuilder.$anonfun$visitPrimitiveDataType$1(AstBuilder.scala:1772)
...

但是当您在my.cnf 中禁用SQL MODE STRICT_TRANS_TABLES 时,MySQL 可以自动将列类型从VARCHAR(n > 65535) 转换为MEDIUMTEXT/LONGTEXT。 所以你可以这样写代码:

// the length of column "name" over the limit of VARCHAR(65535),
// it will be auto converted to MEDIUMTEXT
jdbcDF.write
  .option("createTableColumnTypes", "name VARCHAR(65536)")
  .jdbc("jdbc://...", "xxx tablename", ...)

然后 MySQL 将创建一个包含列“name”的表,其类型为 MEDIUMTEXT。

【讨论】:

以上是关于可以在 Spark 中写入 MEDIUMTEXT 类型的 MySQL 列吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spark将输出写入foreach批处理中的一个文件

在JAVA中怎么获取mysql表中的mediumtext类型和datatime类型的字段并显示在控制台上?

spark特殊问题 在IDEA中spark(enableHiveSupport)中使用 insert overwrite时对空表可以正常写入但是如果表不为空就会报错处理方法

在 R 和 Sparklyr 中,将表写入 .CSV (spark_write_csv) 会产生许多文件,而不是一个文件。为啥?我可以改变吗?

大数据ClickHouse(十八):Spark 写入 ClickHouse API

Spark DataFrame写入HBase的常用方式