我正在使用Spark SQL从一个MySQL表中读入一个数据框,其中有一列的类型为MEDIUMTEXT。当我将数据框原封不动地写入新表中时,该列现在的类型为TEXT,并且我得到了一个MySQL MysqlDataTruncation异常。
我不知道我是不是运气不好,或者有什么方法可以告诉Spark SQL特定于MySQL的结果列类型是什么。
在座有人对这个问题有所了解吗?
发布于 2020-09-15 17:49:37
您可以使用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)
...但是,当您在MySQL中禁用SQL模式MEDIUMTEXT/LONGTEXT时,STRICT_TRANS_TABLES可以将列类型从my.cnf自动转换为SQL。所以你可以像这样写代码:
// 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将创建一个包含类型为MEDIUMTEXT的列"name“的表。
https://stackoverflow.com/questions/57407612
复制相似问题