无法让 PostgreSQL JDBC 在 Spark 环境中与 PySpark 配合使用

问题描述 投票:0回答:1

我想与远程 Linux 机器中的 postgresql 数据库进行交互。 Postgres 是 12,Linux 是 openjdk 1.8.0_402。为了获取 postgresql JDBC,我访问 https://jdbc.postgresql.org/download/ 并下载了 postgresql-42.7.2.jar。

尝试使用下面的Python脚本从pg数据库中提取一些快速数据:

# Import SparkSession
from pyspark.sql import SparkSession

# Create a SparkSession
spark = SparkSession.builder \
    .appName("PostgresToSparkDataframe") \
    .config("spark.driver.extraClassPath", "/usr/share/java/postgresql-jdbc/postgresql-42.7.2.jar") \
    .getOrCreate()

# Define PostgreSQL connection details
jdbcUrl = "jdbc:postgresql://XX.XX.XX.XX:5432/daname"
dbProperties = {
    "user": "username",
    "password": "userpsw",
    "driver": "org.postgresql.Driver"
}

# Read data into Spark DataFrame
df = spark.read.jdbc(url=jdbcUrl, table="schemaname.tablename", properties=dbProperties)

# Show the DataFrame
df.show()

但是一直报错,提示jdbc不正确??

Py4JJavaError: An error occurred while calling o90.jdbc.
: java.lang.ClassNotFoundException: org.postgresql.Driver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ......

为了进行快速测试,我尝试从 Spark-Shell 中的该表中提取数据,这很简单。

我还尝试了 postgresql-42.6.1.jar 和 postgresql-42.3.8.jar,但它们都不适合我。

感觉好像还漏掉了一些东西......

apache-spark pyspark jdbc
1个回答
0
投票

请确保您有读取 JDBC 驱动文件的权限,您可以按如下方式检查:

user@server01:~ # ls -l /usr/share/java/postgresql-jdbc/postgresql-42.7.2.jar
-rw-r--r-- 1 root root 1089136  2月 20 23:22 /usr/share/java/postgresql-jdbc/postgresql-42.7.2.jar
user@server01:~ # jar tvf /usr/share/java/postgresql-jdbc/postgresql-42.7.2.jar|grep org.postgresql.Driver
   988 Fri Feb 01 00:00:00 CST 1980 org/postgresql/Driver$1.class
  3721 Fri Feb 01 00:00:00 CST 1980 org/postgresql/Driver$ConnectThread.class
 19511 Fri Feb 01 00:00:00 CST 1980 org/postgresql/Driver.class

如果你没有读取权限,你可以以 root 身份运行 chmod +r /usr/share/java/postgresql-jdbc/postgresql-42.7.2.jar 来获取它。

© www.soinside.com 2019 - 2024. All rights reserved.