【问题标题】:pyspark dataframe error due to java.lang.ClassNotFoundException: org.postgresql.Driver由于 java.lang.ClassNotFoundException: org.postgresql.Driver 导致的 pyspark 数据框错误
【发布时间】:2021-10-01 10:04:21
【问题描述】:

我想使用 JDBC 从 Postgresql 读取数据并将其存储在 pyspark 数据框中。当我想使用 df.show()、df.take() 等方法预览数据框中的数据时,它们会返回一个错误,说明原因是:java.lang.ClassNotFoundException: org.postgresql.Driver。但是 df.printschema() 会完美地返回数据库表的信息。 这是我的代码:

from pyspark.sql import SparkSession

spark = (SparkSession
         .builder
         .master("spark://spark-master:7077")
         .appName("read-postgres-jdbc")
         .config("spark.driver.extraClassPath", "/opt/workspace/postgresql-42.2.18.jar")
         .config("spark.executor.memory", "1g")
         .getOrCreate())
sc = spark.sparkContext

df = (
    spark.read
    .format("jdbc")
    .option("driver", "org.postgresql.Driver")
    .option("url", "jdbc:postgresql://postgres/postgres")    
    .option("table", "public.\"ASSET_DATA\"")
    .option("dbtable", _select_sql)
    .option("user", "airflow")
    .option("password", "airflow")
    .load()
)

df.show(1)

错误日志:

Py4JJavaError: An error occurred while calling o44.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, 172.21.0.6, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver

Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver

于 2021 年 7 月 24 日编辑 该脚本是在 JupyterLab 上与独立 Spark 集群分开的 docker 容器中执行的。

【问题讨论】:

    标签: postgresql apache-spark jdbc pyspark


    【解决方案1】:

    您没有使用正确的选项。 在阅读doc 时,您会看到:

    附加到驱动程序的类路径之前的类路径条目。 注意:在客户端模式下,这个配置不能直接在你的应用程序中通过 SparkConf 设置,因为此时驱动程序 JVM 已经启动。相反,请通过 --driver-class-path 命令行选项或在您的默认属性文件中进行设置。

    此选项适用于驱动程序。这就是模式获取起作用的原因,它是在驱动程序端完成的操作。但是当你运行一个 spark 命令时,这个命令是由工人(或执行者)执行的。他们还需要拥有.jar 才能访问 postgres。

    如果您的 postgres 驱动程序(“/opt/workspace/postgresql-42.2.18.jar”)不需要任何依赖项,那么您可以使用 spark.jars 将其添加到工作程序 - 我知道 mysql 不需要依赖项例如,但我从未尝试过 postgres。如果它需要依赖,那么最好使用 spark.jars.packages 选项直接从 maven 调用包。 (请参阅文档的链接以获取帮助)

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 2023-01-17
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多