使用pyspark连接到PostgreSQL
我试图连接到与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"
)
,我收到以下错误:
任何想法为什么会发生这种情况?
编辑:我试图在我的电脑本地运行代码。
您通常需要两种:
- 在群集上安装的Postgres驱动程序,
- 提供从客户端与--jars选项
- 或提供maven的Postgres的驱动程序jar Postgres驱动程序的坐标与--packages选项。
如果你详细介绍了如何启动pyspark,我们可能会给你更多的细节。
一些线索/想法:
此异常意味着JDBC驱动程序不驾驶员类路径中。 您可以使用--jar
参数激发提交jdbc jar,并使用spark.driver.extraClassPath
将其添加到驱动程序类路径中。
以下为我工作在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
。
以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()
这是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中工作正常
如果我试图在本地运行它,该怎么办?我需要下载postgres驱动程序吗?我应该在哪里存储它? –
是的,你需要它。因为您充当Postgres客户端,并且您指定要在“driver =”org.postgresql.Driver“”选项中使用Postgres驱动程序。您可以将其存储在本地计算机的任何位置(例如,java安装的jre \ lib \ ext),并在CLASSPATH中指定存储路径。 – MiguelPeralvo