postgresql - 从 Spark/pyspark 连接到 PostgreSQL

标签 postgresql jdbc jar apache-spark pyspark

我已经在 Windows 机器上安装了 Spark 并想通过 Spyder 使用它。经过一些故障排除后,基础知识似乎起作用了:

import os

os.environ["SPARK_HOME"] = "D:\Analytics\Spark\spark-1.4.0-bin-hadoop2.6"

from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext

spark_config = SparkConf().setMaster("local[8]")
sc = SparkContext(conf=spark_config) 
sqlContext = SQLContext(sc)

textFile = sc.textFile("D:\\Analytics\\Spark\\spark-1.4.0-bin-hadoop2.6\\README.md")
textFile.count()
textFile.filter(lambda line: "Spark" in line).count()

sc.stop()

这按预期运行。我现在想连接到在同一台服务器上运行的 Postgres9.3 数据库。我已经从这里下载了 JDBC 驱动程序 here并将其放在文件夹 D:\Analytics\Spark\spark_jars 中。然后我创建了一个新文件 D:\Analytics\Spark\spark-1.4.0-bin-hadoop2.6\conf\spark-defaults.conf 包含这一行:

spark.driver.extraClassPath        'D:\\Analytics\\Spark\\spark_jars\\postgresql-9.3-1103.jdbc41.jar'

我已经运行了以下代码来测试连接

import os

os.environ["SPARK_HOME"] = "D:\Analytics\Spark\spark-1.4.0-bin-hadoop2.6"

from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext

spark_config = SparkConf().setMaster("local[8]")
sc = SparkContext(conf=spark_config) 
sqlContext = SQLContext(sc)

df = (sqlContext
    .load(source="jdbc",
          url="jdbc:postgresql://[hostname]/[database]?user=[username]&password=[password]",
          dbtable="pubs")
 )
sc.stop()

但出现以下错误:

Py4JJavaError: An error occurred while calling o22.load.
: java.sql.SQLException: No suitable driver found for     jdbc:postgresql://uklonana01/stonegate?user=analytics&password=pMOe8jyd
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:118)
at org.apache.spark.sql.jdbc.JDBCRelation.<init>(JDBCRelation.scala:128)
at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:113)
at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:265)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
at py4j.Gateway.invoke(Gateway.java:259)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:207)
at java.lang.Thread.run(Unknown Source)

如何检查我是否下载了正确的 .jar 文件或错误可能来自何处?

最佳答案

我尝试过 SPARK_CLASSPATH 环境变量,但它不适用于 Spark 1.6。

来自以下帖子的其他答案建议添加 pyspark 命令参数并且它有效。

Not able to connect to postgres using jdbc in pyspark shell

Apache Spark : JDBC connection not working

pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>

关于postgresql - 从 Spark/pyspark 连接到 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30940566/

相关文章:

database - 函数参数忽略 PostgreSQL 时间戳/数字精度?

postgresql - 在无法接受集合的上下文中调用的集合值函数

java - 从 DB2 选择给出 [SQL0501] Cursor CRSR0001 not open

java - Netbeans 中的目录可读,但从 JAR 文件运行时不可读

linux - 在 postgres 9.4 中使用触发器执行外部程序

sql - 如何在其他字符中间使用 psql 变量?

java - 关闭连接后没有操作,绕过我对关闭连接的检查?

java - 如何从oracle集合中检索clob数据

java - FindBugs Ant 任务是否需要 JAR?

java - 如何从可运行的 jar 创建 txt 文件?