2016-01-22 906 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中工作正常