可以在 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 列吗?的主要内容,如果未能解决你的问题,请参考以下文章
在JAVA中怎么获取mysql表中的mediumtext类型和datatime类型的字段并显示在控制台上?
spark特殊问题 在IDEA中spark(enableHiveSupport)中使用 insert overwrite时对空表可以正常写入但是如果表不为空就会报错处理方法
在 R 和 Sparklyr 中,将表写入 .CSV (spark_write_csv) 会产生许多文件,而不是一个文件。为啥?我可以改变吗?