使用pyspark连接到PostgreSQL

Mpi*_*ris 12 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"
)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

在此输入图像描述

知道为什么会这样吗?

编辑:我试图在我的计算机本地运行代码.

mdh*_*mdh 12

以下是在localhost上使用postgres为我工作的:

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

对于pysparkshell,您使用SPARK_CLASSPATH环境变量:

$ export SPARK_CLASSPATH=/path/to/downloaded/jar
$ pyspark
Run Code Online (Sandbox Code Playgroud)

要通过spark-submit使用--driver-class-path标志提交脚本:

$ spark-submit --driver-class-path /path/to/downloaded/jar script.py
Run Code Online (Sandbox Code Playgroud)

在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
)
Run Code Online (Sandbox Code Playgroud)

或者:

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

请注意,通过提交脚本时spark-submit,您需要定义sqlContext.


Gal*_*ses 8

要使用pyspark和jupyter笔记本笔记本:首先使用以下命令打开pyspark

pyspark --driver-class-path /spark_drivers/postgresql-42.2.12.jar  --jars /spark_drivers/postgresql-42.2.12.jar
Run Code Online (Sandbox Code Playgroud)

然后在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)
Run Code Online (Sandbox Code Playgroud)


小智 6

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()
Run Code Online (Sandbox Code Playgroud)

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

  • 它对我不起作用,它仍然给出“java.lang.ClassNotFoundException:org.postgresql.Driver”有什么想法吗? (5认同)
  • 这个有效!我在 jupyter 实验室运行我的代码。我尝试停止并重新启动“spark”会话,但它没有加载。当我重新启动 jupyter 内核时,它起作用了! (3认同)

Che*_*lle 5

在所有节点上都必须复制postgresql-42.1.4.jar ...对于我来说,我确实在路径/opt/spark-2.2.0-bin-hadoop2.7/jars中复制了

另外,我在〜/ .bashrc中设置类路径(export SPARK_CLASSPATH =“ / opt / spark-2.2.0-bin-hadoop2.7 / jars”)

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

  • 我正在寻找如何在Amazon EMR中执行此操作。它曾经对我有用,只是设置spark.jar = / path / to / driver,但是在EMR 5.2.1(Spark版本2.0.2)之后,我再也无法使用了。 (5认同)

Mig*_*lvo 4

您通常需要:

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

如果您详细说明如何启动 pyspark,我们可能会为您提供更多详细信息。

一些线索/想法:

Spark 找不到 postgres jdbc 驱动程序

无法在 pyspark shell 中使用 jdbc 连接到 postgres