【问题标题】:Best Practice when Writing PySpark DataFrames to MySQL将 PySpark 数据帧写入 MySQL 时的最佳实践
【发布时间】:2021-10-28 03:00:30
【问题描述】:

我正在尝试使用带有预定 Spark 作业的 Apache Airflow 开发一些数据管道。

对于其中一个管道,我正在尝试将数据从 PySpark DataFrame 写入 MySQL,但我一直遇到一些问题。这只是我的代码现在的样子,但我确实想在未来为此添加更多转换,

df_tsv = spark.read.csv(tsv_file, sep=r'\t', header=True)
df_tsv.write.jdbc(url=mysql_url, table=mysql_table, mode="append", properties={"user":mysql_user, "password": mysql_password, "driver": "com.mysql.cj.jdbc.Driver" })

这是不断引发的异常,

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

我想知道的第一件事是如何解决上述问题。

其次,我想知道将数据从 Spark 写入 MySQL 等数据库时的最佳实践是什么。例如,是否可以选择将 DataFrame 中给定列的数据存储在表中的指定列中?还是表的列名应该和DataFrame的列名一样?

我能想到的另一个选择是将 DataFrame 转换为元组列表,然后使用 mysql-python-connector 之类的东西将数据加载到数据库中,

rdd = df.rdd
b = rdd.map(tuple)
data = b.collect()

# write data to database using mysql-python-connector

这里有什么更有效的选择?还有其他我不知道的选项吗?

【问题讨论】:

    标签: python mysql pyspark apache-spark-sql airflow


    【解决方案1】:

    java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

    我想知道的第一件事是如何解决上述问题。

    您需要在启动 Spark 会话时传递 JDBC 连接器https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

    其次,我想知道将数据从 Spark 写入 MySQL 等数据库时的最佳实践是什么。例如,是否可以选择将 DataFrame 中给定列的数据存储在表中的指定列中?还是表的列名应该和DataFrame的列名一样?

    是的,数据框列名将与表列名匹配。

    我能想到的另一个选择是将 DataFrame 转换为元组列表,然后使用 mysql-python-connector 之类的东西将数据加载到数据库中,

    rdd = df.rdd

    b = rdd.map(tuple)

    data = b.collect()

    # write data to database using mysql-python-connector

    不,永远不要这样做,这将破坏使用 Spark(分布式计算)的所有目的。查看上面的链接,您会发现一些关于从哪里开始以及如何读取/写入 JDBC 数据源的好建议。

    【讨论】:

    • 请问他们是否已经展示了如何通过在您提到的页面中传递驱动程序来创建 Spark 会话?据我所知,他们是从 spark.read 开始的?
    • 是这样的./bin/spark-shell --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar
    • 知道了,抱歉,我有点困惑,因为我使用的是 Airflow。就我而言,驱动程序的驱动程序路径必须在 SparkSubmitOperator 中指定。
    • 将 postgresql jdbc 驱动 jars 添加到 spark libs 目录。
    猜你喜欢
    • 2020-10-06
    • 2018-06-24
    • 2021-08-13
    • 2021-07-26
    • 2020-07-10
    • 2020-11-26
    • 2013-06-30
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多