使用pyspark连接到PostgreSQL

时间:2016-01-22 13:51:07

标签: postgresql apache-spark pyspark

我正在尝试使用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"
)

我收到以下错误:

enter image description here

知道为什么会这样吗?

编辑:我正在尝试在我的计算机上本地运行代码。

11 个答案:

答案 0 :(得分:11)

以下内容适用于本地主机上的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

答案 1 :(得分:4)

在所有节点中都是必要的副本postgresql-42.1.4.jar ...对于我的情况,我确实复制了路径/opt/spark-2.2.0-bin-hadoop2.7/jars

另外,我在〜/ .bashrc中设置了classpath(导出SPARK_CLASSPATH =" /opt/spark-2.2.0-bin-hadoop2.7/jars")

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

答案 2 :(得分:2)

您通常需要:

  1. 在群集上安装Postgres驱动程序,
  2. 使用--jars选项
  3. 从您的客户端提供Postgres驱动程序jar
  4. 或使用--packages选项提供Postgres驱动程序的maven坐标。
  5. 如果您详细说明如何启动pyspark,我们可能会向您提供更多详细信息。

    一些线索/想法:

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

    Not able to connect to postgres using jdbc in pyspark shell

答案 3 :(得分:2)

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

这会下载驱动程序into ~/.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()

答案 4 :(得分:1)

要使用pyspark和jupyter笔记本笔记本:首先使用

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

然后在jupyter笔记本中

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)

答案 5 :(得分:1)

我无法使用计算机上的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()

答案 6 :(得分:0)

此异常表示jdbc驱动程序不在驱动程序类路径中。 你可以使用spark.driver.extraClassPath参数激活提交jdbc jar,也可以使用AddYears将其添加到驱动程序类路径中。

答案 7 :(得分:0)

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

然后用您的替换数据库配置值。

<script src="/js/jquery-ui.min.js"></script>
<script src="/js/datepicker-it.js"></script>

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

答案 8 :(得分:0)

只需使用--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()

答案 9 :(得分:0)

我也发现了这个错误

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

答案 10 :(得分:0)

  1. here 下载 postgresql jar:
  2. 将此添加到 ~Spark/jars/ 文件夹。
  3. 重新启动内核。 它应该可以工作。