簡體   English   中英

使用pyspark連接PostgreSQL

[英]Using pyspark to connect to PostgreSQL

我正在嘗試使用 pyspark 連接到數據庫,並且正在使用以下代碼:

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"
)

我收到以下錯誤:

在此處輸入圖片說明

知道為什么會這樣嗎?

編輯:我試圖在我的計算機上本地運行代碼。

https://jdbc.postgresql.org/download.html下載 PostgreSQL JDBC 驅動程序

然后用你的替換數據庫配置值。

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.jars", "/path_to_postgresDriver/postgresql-42.2.5.jar") \
    .getOrCreate()

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://localhost:5432/databasename") \
    .option("dbtable", "tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.printSchema()

更多信息:https ://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

以下為我在本地主機上使用 postgres 工作:

https://jdbc.postgresql.org/download.html下載 PostgreSQL JDBC 驅動程序。

對於pyspark shell,您使用SPARK_CLASSPATH環境變量:

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

要通過spark-submit提交腳本,請使用--driver-class-path標志:

$ 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()

請注意,通過spark-submit提交腳本時,您需要定義sqlContext

在所有節點中都需要復制 postgresql-42.1.4.jar ......就我而言,我確實復制了路徑 /opt/spark-2.2.0-bin-hadoop2.7/jars

另外,我在 ~/.bashrc 中設置了類路徑(導出 SPARK_CLASSPATH="/opt/spark-2.2.0-bin-hadoop2.7/jars" )

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

您通常需要:

  1. 在您的集群上安裝 Postgres 驅動程序,
  2. 使用 --jars 選項從您的客戶端提供 Postgres 驅動程序 jar
  3. 或者使用 --packages 選項提供 Postgres 驅動程序的 maven 坐標。

如果您詳細說明如何啟動 pyspark,我們可能會為您提供更多詳細信息。

一些線索/想法:

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

無法在 pyspark shell 中使用 jdbc 連接到 postgres

一種基於快速入門指南示例的方法是這篇博客文章,它展示了如何將--packages org.postgresql:postgresql:9.4.1211參數添加到spark-submit命令。

~/.ivy2/jars驅動程序下載到~/.ivy2/jars目錄中,在我的例子中是/Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar 將此作為--driver-class-path選項傳遞給完整的 spark-submit 命令:

/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()

要使用 pyspark 和 jupyter notebook notebook:首先打開 pyspark

pyspark --driver-class-path /spark_drivers/postgresql-42.2.12.jar  --jars /spark_drivers/postgresql-42.2.12.jar

然后在 jupyter notebook 中

import os
jardrv = "~/spark_drivers/postgresql-42.2.12.jar"


from pyspark.sql import SparkSession
spark = SparkSession.builder.config('spark.driver.extraClassPath', jardrv).getOrCreate()
url = 'jdbc:postgresql://127.0.0.1/dbname'
properties = {'user': 'usr', 'password': 'pswd'}
df = spark.read.jdbc(url=url, table='tablename', properties=properties)

我無法使用計算機上的 jar 連接到 postgresDB。 此代碼解決了我的驅動程序問題

 from pyspark.sql import SparkSession
 import os

 sparkClassPath = os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages org.postgresql:postgresql:42.1.1 pyspark-shell'

 spark = SparkSession \
    .builder \
    .config("spark.driver.extraClassPath", sparkClassPath) \
    .getOrCreate()

 df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://localhost:5432/yourDBname") \
    .option("driver", "org.postgresql.Driver") \
    .option("dbtable", "yourtablename") \
    .option("user", "postgres") \
    .option("password", "***") \
    .load()

df.show()

此異常意味着 jdbc 驅動程序不在驅動程序類路徑中。 您可以使用--jar參數 spark-submit jdbc jars,也可以使用spark.driver.extraClassPath將其添加到驅動程序類路徑中。

我也收到這個錯誤

java.sql.SQLException: No suitable driver
 at java.sql.DriverManager.getDriver(Unknown Source)

並加入一個項目.config('spark.driver.extraClassPath', './postgresql-42.2.18.jar')SparkSession -奏效。

例如:

from pyspark import SparkContext, SparkConf
import os
from pyspark.sql.session import SparkSession

spark = SparkSession \
    .builder \
    .appName('Python Spark Postgresql') \
    .config("spark.jars", "./postgresql-42.2.18.jar") \
    .config('spark.driver.extraClassPath', './postgresql-42.2.18.jar') \
    .getOrCreate()


df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://localhost:5432/abc") \
    .option("dbtable", 'tablename') \
    .option("user", "postgres") \
    .option("password", "1") \
    .load()

df.printSchema()

只需使用--jars <path/to/your/jdbc.jar>初始化 pyspark

例如: pyspark --jars /path/Downloads/postgresql-42.2.16.jar

然后按照上面其他答案中的建議創建一個數據框

例如:

df2 = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/db").option("dbtable", "yourTableHere").option("user", "postgres").option("password", "postgres").option("driver", "org.postgresql.Driver").load()
  1. 這里下載 postgresql jar:
  2. 將此添加到 ~Spark/jars/ 文件夾。
  3. 重啟你的內核。 它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM