请仔细阅读,这不是this的重复。
我正在尝试通过 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
所以我找到了this并且它工作得很好,因为我可以看到我的表的架构(我在解释器配置中添加了spark.driver.extraClassPath变量):
root
|-- domaine: string (nullable = true)
|-- traitement: string (nullable = true)
|-- parquet: string (nullable = true)
|-- status: string (nullable = true)
|-- date: date (nullable = true)
但是,当我尝试执行
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
我假设这意味着在主节点上。解决此问题:
hdfs://
。将其放入 HDFS 是更好的选择。这里 HDFS 与所有 CORE & TASK 实例共享。s3://
)PS:我不知道你如何能够使用
spark.driver.extraClassPath
查看模式
我通过在 Zeppelin 解释器菜单中添加以下参数解决了这个问题:
spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar
spark.jars.packages=org.postgresql:postgresql:42.2.18
将包设置为配置,它会自动下载。
spark = SparkSession.builder \
.appName("RSSWorldStreamer") \
.config("spark.jars.packages", "org.postgresql:postgresql:42.6.0") \
.getOrCreate()
我所做的是,下载 postgres jdbc 驱动程序并将其粘贴到给定路径下的 jar 文件夹中。
安装任何库后,会创建一个文件夹,并为 pyspark 创建相同的文件夹。在我的 python 环境的 pyspark 目录内的 jar 文件夹中,我粘贴了我的 jar 文件,它对我有用。尝试一下,它对所有人都有效。
python env 的路径 - env-path/pyspark/lib/python3.11/site-packages/pyspark/jars
我的代码如下供参考
from pyspark import SparkContext, SparkConf
import os
from pyspark.sql.session import SparkSession
spark = SparkSession \
.builder \
.appName('Python Spark Postgresql').getOrCreate()
df = spark.read \
.format("jdbc") \
.option("driver", "org.postgresql.Driver") \
.option("url", "jdbc:postgresql://localhost:5432/db-name") \
.option("dbtable", 'table_name') \
.option("user", "usr") \
.option("password", "pwd") \
.load()
df.printSchema()