使用 pySpark 将 DataFrame 写入 mysql 表

Posted

技术标签:

【中文标题】使用 pySpark 将 DataFrame 写入 mysql 表【英文标题】:Write DataFrame to mysql table using pySpark 【发布时间】:2017-10-03 19:39:29 【问题描述】:

我正在尝试将记录插入到mysql 表中。该表包含idname 作为列。

我在pyspark shell 中执行如下操作。

name = 'tester_1'
id = '103'  
import pandas as pd
l = [id,name]

df = pd.DataFrame([l])

df.write.format('jdbc').options(
      url='jdbc:mysql://localhost/database_name',
      driver='com.mysql.jdbc.Driver',
      dbtable='DestinationTableName',
      user='your_user_name',
      password='your_password').mode('append').save()

我收到以下属性错误

AttributeError: 'DataFrame' object has no attribute 'write'

我做错了什么?从pySparkMySql表中插入记录的正确方法是什么

【问题讨论】:

【参考方案1】:

使用 Spark DataFrame 而不是 pandas',因为 .write 仅适用于 Spark DataFrame

所以最终的代码可能是

data =['103', 'tester_1']

df = sc.parallelize(data).toDF(['id', 'name'])

df.write.format('jdbc').options(
      url='jdbc:mysql://localhost/database_name',
      driver='com.mysql.jdbc.Driver',
      dbtable='DestinationTableName',
      user='your_user_name',
      password='your_password').mode('append').save()

【讨论】:

我收到以下错误java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource does not allow create table as select.。有没有其他替代方案。 该表是否存在于数据源中并尝试使用mode 也。 我在下面得到这个错误 java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource does not allow create table as select.. 还有其他替代方法吗这个。 @Karn_way: 表存在于目标中还是正在创建中? 是的表确实存在。我正在使用带有 mysql 的 CDH 映像。我认为它已在 spark 2.0 中修复,在我的图像中它是 1.6

以上是关于使用 pySpark 将 DataFrame 写入 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章

如何将大型 Pyspark DataFrame 写入 DynamoDB

将大型 DataFrame 从 PySpark 写入 Kafka 遇到超时

将 Pyspark DataFrame 写入 Parquet 时出现 Py4JJavaError

Pyspark - 将数据帧写入 2 个不同的 csv 文件

将小 PySpark DataFrame 写入镶木地板时出现内存错误

如何使用 PySpark 将 JSON 列类型写入 Postgres?