Pyspark 连接到 ipython 笔记本中的 Postgres 数据库

Posted

技术标签:

【中文标题】Pyspark 连接到 ipython 笔记本中的 Postgres 数据库【英文标题】:Pyspark connection to Postgres database in ipython notebook 【发布时间】:2017-10-24 20:51:49 【问题描述】:

我已经阅读了以前的帖子,但我仍然无法确定为什么我无法将我的 ipython 笔记本连接到 Postgres 数据库。

我可以在 ipython 笔记本中启动 pyspark,SparkContext 被加载为“sc”。

我的 .bash_profile 中有以下内容用于查找 Postgres 驱动程序:

export SPARK_CLASSPATH=/path/to/downloaded/jar

这是我在 ipython 笔记本中连接数据库的操作(基于this 帖子):

from pyspark.sql import DataFrameReader as dfr
sqlContext = SQLContext(sc)

table= 'some query'
url = 'postgresql://localhost:5432/dbname'
properties = 'user': 'username', 'password': 'password'

df = dfr(sqlContext).jdbc(
url='jdbc:%s' % url, table=table, properties=properties
)

错误:

Py4JJavaError: An error occurred while calling o156.jdbc.
: java.SQL.SQLException: No suitable driver.

我知道查找已下载的驱动程序时出错,但我不明白为什么在我的 .bash_profile 中添加了该驱动程序的路径时会出现此错误。

我也尝试通过 pyspark --jars 设置驱动程序,但出现“没有这样的文件或目录”错误。

这个blogpost 也显示了如何连接到 Postgres 数据源,但是下面也给了我一个“没有这样的目录”的错误:

 ./bin/spark-shell --packages org.postgresql:postgresql:42.1.4

附加信息:

spark version: 2.2.0
python version: 3.6
java: 1.8.0_25
postgres driver: 42.1.4

【问题讨论】:

【参考方案1】:

我不确定为什么上述答案对我不起作用,但我想我也可以分享从 jupyter notebook 运行 pyspark 时实际对我有用的东西(Spark 2.3.1 - Python 3.6.3):

from pyspark.sql import SparkSession
spark = SparkSession.builder.config('spark.driver.extraClassPath', '/path/to/postgresql.jar').getOrCreate()
url = 'jdbc:postgresql://host/dbname'
properties = 'user': 'username', 'password': 'pwd'
df = spark.read.jdbc(url=url, table='tablename', properties=properties)

【讨论】:

【参考方案2】:

他们已经多次更改了 Apache Spark 中的工作方式。查看我的设置,这就是我的 .bashrc(Mac 上的 .bash_profile)中的内容,因此您可以尝试一下:export SPARK_CLASSPATH=$SPARK_CLASSPATH:/absolute/path/to/your/driver.jar 编辑:我使用的是 Spark 1.6.1。

并且,与往常一样,请确保使用新的 shell 或获取脚本,以便拥有更新的 envvar(在运行 ipython notebook 之前在 shell 中使用 echo $SPARK_CLASSPATH 进行验证)。

【讨论】:

绝对路径是什么意思?我得到了驱动程序的真实路径并使用了它。我更改为上面显示的方式并遇到同样的问题。 看来 spark 类路径已被弃用:github.com/elastic/elasticsearch-hadoop/pull/580 我已经连接,一旦我有时间我会上传我的解决方案以便记录,但基本上,我认为这是因为 spark_classpath 已被弃用,所以你必须使用 --driver-class-路径 @cocanut 通过绝对路径,我的意思是不使用任何~ 快捷方式。我认为你做对了。是的,这是我对 Spark 的抱怨之一:有很多不推荐使用的方法来做所有事情。 SPARK_CLASSPATH 尽管已被弃用,但对我有用,但我使用的是 1.6.1。【参考方案3】:

我按照this 帖子中的指示进行操作。 SparkContext 已经为我设置为 sc,所以我所要做的就是从我的 .bash_profile 中删除 SPARK_CLASSPATH 设置,并在我的 ipython 笔记本中使用以下内容:

import os

os.environ['PYSPARK_SUBMIT_ARGS'] = '--driver-class-path /path/to/postgresql-42.1.4.jar --jars /path/to/postgresql-42.1.4.jar pyspark-shell'

我还向属性添加了“驱动程序”设置,并且它起作用了。正如本文其他地方所述,这可能是因为 SPARK_CLASSPATH 已被弃用,最好使用 --driver-class-path。

【讨论】:

以上是关于Pyspark 连接到 ipython 笔记本中的 Postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Jupyter 笔记本上的 pyspark 从 Apache Spark 连接到 MS SQL

Ipython 笔记本中的 pyspark 引发 Py4JNetworkError

将本地 IPython 笔记本连接到气隙集群上的 Spark

将 IPython notebook 连接到在不同机器上运行的 spark master

从 Docker 容器将 PySpark 连接到 Kafka

使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr