我想与远程 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,但它们都不适合我。
感觉好像还漏掉了一些东西......
请确保您有读取 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 来获取它。