postgresql - 如何使用 JDBC 将 (Py)Spark 连接到 Postgres 数据库

标签 postgresql jdbc apache-spark pyspark apache-spark-sql

我已按照 this posting 中的说明进行操作从现有的 Postgres 数据库中读取数据,表名为“objects”,由 SQLalchemy 中的 Objects 类定义和创建。在我的 Jupyter notebook 中,我的代码是

from pyspark import SparkContext
from pyspark import SparkConf
from random import random

#spark conf
conf = SparkConf()
conf.setMaster("local[*]")
conf.setAppName('pyspark')

sc = SparkContext(conf=conf)

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
properties = {
    "driver": "org.postgresql.Driver"
}
url = 'jdbc:postgresql://PG_USER:PASSWORD@PG_SERVER_IP/db_name'
df = sqlContext.read.jdbc(url=url, table='objects', properties=properties)

最后一行结果如下:

Py4JJavaError: An error occurred while calling o25.jdbc.
: java.lang.NullPointerException
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:158)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:117)
    at org.apache.spark.sql.DataFrameReader.jdbc(DataFrameReader.scala:237)
    at org.apache.spark.sql.DataFrameReader.jdbc(DataFrameReader.scala:159)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:280)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:128)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:211)
    at java.lang.Thread.run(Thread.java:745)

所以看起来它无法解析表格。如何从此处进行测试以确保我已正确连接到数据库?

最佳答案

名称解析问题由 org.postgresql.util.PSQLException 指示,不会导致 NPE。问题的根源实际上是连接字符串,尤其是您提供用户凭据的方式。乍一看它像是一个错误,但如果您正在寻找快速解决方案,您可以使用 URL 属性:

url = 'jdbc:postgresql://PG_SERVER_IP/db_name?user=PG_USER&password=PASSWORD'

或属性参数:

properties = {
    "user": "PG_USER",
    "password": "PASSWORD",
    "driver": "org.postgresql.Driver"
}

关于postgresql - 如何使用 JDBC 将 (Py)Spark 连接到 Postgres 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318667/

相关文章:

java - 如何使用两个 Multi-Tenancy 数据源之间的事务复制数据?

java - 使用Java的Spark MLlib分类输入格式

mysql - 如何更改 MySql for PostgreSQL 中的触发器?

java - PreparedStatement抛出索引未超出范围时抛出超出范围

java - oracle.sql.CLOB 无法转换为 oracle.sql.DatumWithConnection

scala - 图 : Is it possible to execute a program on each vertex without receiving a message?

python - Spark UDF 结果可以执行 'show' ,但不能执行 'filter'

sql - Postgresql 中连续相同符号行的总和

java - 在 hibernate @Formula中使用自定义方言功能

postgresql - 在postgresql中查找与另一个常量字段关联的一个字段的最大值