PySpark,使用 JDBC 写入 MySQL 时的列顺序

flo*_*ose 3 mysql jdbc apache-spark apache-spark-sql pyspark

我正在努力理解 Spark 并将数据帧写入 mysql 数据库。我有以下代码:

forecastDict = {'uuid': u'8df34d5a-ce02-4d02-b282-e10363690122', 'created_at': datetime.datetime(2014, 12, 31, 23, 0)}
forecastFrame =  sqlContext.createDataFrame([forecastDict])    
forecastFrame.write.jdbc(url="jdbc:mysql://example.com/example_db?user=bla&password=blabal123", table="example_table", mode="append")
Run Code Online (Sandbox Code Playgroud)

代码中的最后一行抛出以下错误:

Incorrect datetime value: '8df34d5a-ce02-4d02-b282-e10363690122' for column 'created_at' at row 1
Run Code Online (Sandbox Code Playgroud)

如有必要,我可以发布整个堆栈跟踪,但基本上这里发生的情况是将字段pyspark映射uuid到 mysql 中的错误列。这是 mysql 的定义:

mysql> show create table example_table;
...
CREATE TABLE `example_table` (
`uuid` varchar(36) NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
...
Run Code Online (Sandbox Code Playgroud)

如果我们将 mysql 定义更改为以下内容(请注意,只有列的顺序不同):

CREATE TABLE `example_table` (
`created_at` datetime NOT NULL,
`uuid` varchar(36) NOT NULL,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

插件工作正常。有没有一种方法可以在不依赖于列的顺序的情况下实现此目的,或者将数据从spark保存到外部关系数据库的首选方法是什么?

谢谢!

- 克里斯

zer*_*323 5

我会简单地强制写入时的预期顺序:

url = ...
table = ...

columns = (sqlContext.read.format('jdbc')
  .options(url=url, dbtable=table)
  .load()
  .columns())

forecastFrame.select(*columns).write.jdbc(url=url, dbtable=table, mode='append')
Run Code Online (Sandbox Code Playgroud)

在字典上使用模式推断时也要小心。这不仅已被弃用,而且相当不稳定。