df.show返回java.lang.ClassNotFoundException:org.postgresql.Driver

df.show返回java.lang.ClassNotFoundException:org.postgresql.Driver,postgresql,jdbc,pyspark,amazon-rds,amazon-emr,Postgresql,Jdbc,Pyspark,Amazon Rds,Amazon Emr,请仔细阅读,这不是重复的 我正在尝试通过AWS上的EMR访问RDS数据库。我是在齐柏林飞艇上做的: from pyspark.sql import SparkSession spark = SparkSession \ .builder \ .appName("Python Spark SQL basic example") \ .config("spark.jars", "/home/hadoop/postgresql

请仔细阅读,这不是重复的

我正在尝试通过AWS上的EMR访问RDS数据库。我是在齐柏林飞艇上做的:

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.jars", "/home/hadoop/postgresql-42.2.18.jar") \
    .getOrCreate()

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://host:5432/base") \
    .option("dbtable", "tab") \
    .option("user", "xx") \
    .option("password", "xx") \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.printSchema()
当我执行时,我得到了这个错误:

java.lang.ClassNotFoundException: org.postgresql.Driver 
因此,我发现它运行良好,因为我可以看到表的模式(我在解释器配置中添加了spark.driver.extraClassPath变量):

但是,当我尝试执行
df.show()
以查看表的内容时,它返回与以前相同的错误:

Py4JJavaError: An error occurred while calling o118.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, host, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver
    at org.apache.spark.repl.ExecutorClassLoader.findClass(ExecutorClassLoader.scala:124)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
我不明白为什么我能看到模式而看不到内容


有什么帮助吗?谢谢。

提交hadoop作业应用程序时,可以在任何工作节点(包括主节点)上创建主节点(取决于您的配置)。 如果您使用的是EMR,则默认情况下会在任何工作节点(核心节点)上创建应用程序主节点,但不会在主节点上创建

您的文件存在于
/home/hadoop/postgresql-42.2.18.jar
我假设这意味着主节点上。
您的程序将在应用程序主节点所在的节点上搜索此文件,而它肯定不在主节点上,因为您不会得到任何错误


要解决这个问题:

  • 将jar放在每个核心节点中(不是可伸缩的解决方案)
  • 使用
    hdfs://
    。把它放在HDFS中,这是一个更好的选择。在这里,HDFS与所有核心和任务实例共享
  • 与HDFS相同,而不是S3,并通过EMRFS获取它(
    S3://

  • PS:我不知道您在提交hadoop作业应用程序主节点时,如何使用spark.driver.extraClassPath查看架构(取决于您的配置)。 如果您使用的是EMR,则默认情况下会在任何工作节点(核心节点)上创建应用程序主节点,但不会在主节点上创建

    您的文件存在于
    /home/hadoop/postgresql-42.2.18.jar
    我假设这意味着主节点上。
    您的程序将在应用程序主节点所在的节点上搜索此文件,而它肯定不在主节点上,因为您不会得到任何错误


    要解决这个问题:

  • 将jar放在每个核心节点中(不是可伸缩的解决方案)
  • 使用
    hdfs://
    。把它放在HDFS中,这是一个更好的选择。在这里,HDFS与所有核心和任务实例共享
  • 与HDFS相同,而不是S3,并通过EMRFS获取它(
    S3://

  • PS:我不知道如何使用
    spark.driver.extraClassPath查看模式

    我通过在齐柏林飞艇解释器菜单中添加以下参数解决了此问题:

    spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar 
    spark.jars.packages=org.postgresql:postgresql:42.2.18
    

    我通过在齐柏林飞艇解释器菜单中添加以下参数来解决此问题:

    spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar 
    spark.jars.packages=org.postgresql:postgresql:42.2.18