无法在Pyspark Shell中使用JDBC连接到PostgreSQL

8

我正在使用本地独立集群,在我的Windows电脑上尝试使用以下代码从我们的服务器中加载数据 -

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc", url="jdbc:postgresql://host/dbname", dbtable="schema.tablename")

我已经将SPARK_CLASSPATH设置为-

os.environ['SPARK_CLASSPATH'] = "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\postgresql-9.2-1002.jdbc3.jar"

在执行 sqlContext.load 时,出现了错误提示“jdbc:postgresql”找不到合适的驱动程序。我试图在网上查找解决方案,但并没有找到可行的解决方法。

仅为“jdbc:postgresql找不到合适的驱动程序”..已更新问题。 - Soni Shashank
1
那种情况下,所需的带有驱动程序的jar文件不可用。 - user330315
“..\postgresql-9.2-1002.jdbc3”听起来不像是一个JAR文件的名称,因为它们通常以“.jar”结尾。您需要将JAR文件添加到类路径中,而不是包含JAR文件的文件夹。 - Mark Rotteveel
你是如何运行你的脚本的? - eliasah
我没有运行任何脚本,只是使用pyspark shell。请参考这里的详细问题 - https://dev59.com/810a5IYBdhLWcg3w48Pn - Soni Shashank
显示剩余2条评论
2个回答

5

希望这有所帮助。

在我的环境中,SPARK_CLASSPATH包含了到postgresql连接器的路径。

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

sparkClassPath = os.getenv('SPARK_CLASSPATH', '/path/to/connector/postgresql-42.1.4.jar')

# Populate configuration
conf = SparkConf()
conf.setAppName('application')
conf.set('spark.jars', 'file:%s' % sparkClassPath)
conf.set('spark.executor.extraClassPath', sparkClassPath)
conf.set('spark.driver.extraClassPath', sparkClassPath)
# Uncomment line below and modify ip address if you need to use cluster on different IP address
#conf.set('spark.master', 'spark://127.0.0.1:7077')

sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

url = 'postgresql://127.0.0.1:5432/postgresql'
properties = {'user':'username', 'password':'password'}

df = DataFrameReader(sqlContext).jdbc(url='jdbc:%s' % url, table='tablename', properties=properties)

df.printSchema()
df.show()

这段代码使得你可以在需要时使用pyspark。例如,我已经在Django项目中使用它。

3
我曾经遇到过与mysql相关的同样问题,但我从未能够通过SPARK_CLASSPATH方法使其正常工作。然而,我使用了额外的命令行参数使其正常工作,详见此问题的答案。
为了避免不必要的点击,以下是解决方法:
pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>

嗯,这行代码不完整,对吧?哪些标志需要在它们后面加上值? - Sebastialonso
是的,标记丢失了 -- 我已经编辑回去了。 - 8forty
非常感谢。谢谢。 - Sebastialonso
在PyCharm中如何实现这个想法? - Evan Zamir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接