2016-01-22 89 views
4

我试图连接到与pyspark数据库,我用下面的代码:使用pyspark连接到PostgreSQL

sqlctx = SQLContext(sc) 
df = sqlctx.load(
    url = "jdbc:postgresql://[hostname]/[database]", 
    dbtable = "(SELECT * FROM talent LIMIT 1000) as blah", 
    password = "MichaelJordan", 
    user = "ScottyPippen", 
    source = "jdbc", 
    driver = "org.postgresql.Driver" 
) 

,我收到以下错误:

enter image description here

任何想法为什么会发生这种情况?

编辑:我试图在我的电脑本地运行代码。

回答

1

您通常需要两种:

  1. 在群集上安装的Postgres驱动程序,
  2. 提供从客户端与--jars选项
  3. 或提供maven的Postgres的驱动程序jar Postgres驱动程序的坐标与--packages选项。

如果你详细介绍了如何启动pyspark,我们可能会给你更多的细节。

一些线索/想法:

spark-cannot-find-the-postgres-jdbc-driver

Not able to connect to postgres using jdbc in pyspark shell

+0

如果我试图在本地运行它,该怎么办?我需要下载postgres驱动程序吗?我应该在哪里存储它? –

+0

是的,你需要它。因为您充当Postgres客户端,并且您指定要在“driver =”org.postgresql.Driver“”选项中使用Postgres驱动程序。您可以将其存储在本地计算机的任何位置(例如,java安装的jre \ lib \ ext),并在CLASSPATH中指定存储路径。 – MiguelPeralvo

0

此异常意味着JDBC驱动程序不驾驶员类路径中。 您可以使用--jar参数激发提交jdbc jar,并使用spark.driver.extraClassPath将其添加到驱动程序类路径中。

4

以下为我工作在Postgres在localhost:

https://jdbc.postgresql.org/download.html下载PostgreSQL的JDBC驱动程序。

对于pyspark外壳使用SPARK_CLASSPATH环境变量:通过​​

$ export SPARK_CLASSPATH=/path/to/downloaded/jar 
$ pyspark 

提交脚本中使用​​标志:

$ spark-submit --driver-class-path /path/to/downloaded/jar script.py 

在python脚本加载表格作为DataFrame如下:

from pyspark.sql import DataFrameReader 

url = 'postgresql://localhost:5432/dbname' 
properties = {'user': 'username', 'password': 'password'} 
df = DataFrameReader(sqlContext).jdbc(
    url='jdbc:%s' % url, table='tablename', properties=properties 
) 

或者:

df = sqlContext.read.format('jdbc').\ 
    options(url='jdbc:%s' % url, dbtable='tablename').\ 
    load() 

注意,通过​​提交脚本时,您需要定义sqlContext

0

quick start guide为例构建的一种方法是this blog post,它显示了如何将--packages org.postgresql:postgresql:9.4.1211参数添加到​​命令。

这下载驱动into ~/.ivy2/jars目录,在我的案例/Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar。通过这项作为​​选项提供的全部火花提交命令:

/usr/local/Cellar/apache-spark/2.0.2/bin/spark-submit\ 
--packages org.postgresql:postgresql:9.4.1211\ 
--driver-class-path /Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar\ 
--master local[4] main.py 

而且在main.py

from pyspark.sql import SparkSession 

spark = SparkSession.builder.getOrCreate() 

dataframe = spark.read.format('jdbc').options(
     url = "jdbc:postgresql://localhost/my_db?user=derekhill&password=''", 
     database='my_db', 
     dbtable='my_table' 
    ).load() 

dataframe.show() 
0

这是necesary拷贝PostgreSQL相关42.1.4.jar中的所有节点...对于我的情况,我没有复制路径/opt/spark-2.2.0-bin-hadoop2.7/jars

另外,我在〜/ .bashrc中设置类路径2.2.0-bin-hadoop2.7/jars“)

并在pyspark控制台和jupyter中工作正常