[英]Pyspark code or steps to connect to Presto SQL catalog and execute query on postgresql db using pyspark?
[英]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 中正常工作
您通常需要:
如果您详细说明如何启动 pyspark,我们可能会为您提供更多详细信息。
一些线索/想法:
一种基于快速入门指南示例的方法是这篇博客文章,它展示了如何将--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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.