Python 如何使用JDBC源代码在(Py)Spark中写入和读取数据?
本问题的目的是记录:Python 如何使用JDBC源代码在(Py)Spark中写入和读取数据?,python,scala,apache-spark,apache-spark-sql,pyspark,Python,Scala,Apache Spark,Apache Spark Sql,Pyspark,本问题的目的是记录: 在PySpark中使用JDBC连接读写数据所需的步骤 JDBC源代码和已知解决方案可能存在的问题 只要稍作改动,这些方法就可以与其他受支持的语言(包括Scala和R)一起使用。编写数据 提交应用程序或启动shell时,请包含适用的JDBC驱动程序。例如,您可以使用--packages: bin/pyspark --packages group:name:version 或者组合驱动程序类路径和jars bin/pyspark --driver-class-path
- 在PySpark中使用JDBC连接读写数据所需的步骤
- JDBC源代码和已知解决方案可能存在的问题
--packages
:
bin/pyspark --packages group:name:version
或者组合驱动程序类路径
和jars
bin/pyspark --driver-class-path $PATH_TO_DRIVER_JAR --jars $PATH_TO_DRIVER_JAR
也可以在JVM实例启动之前使用PYSPARK\u SUBMIT\u ARGS
环境变量设置这些属性,或者使用conf/spark defaults.conf
设置spark.jars.packages
或spark.jars
/spark.driver.extraClassPath
:将此:类:append
的内容追加到现有数据DataFrame
:覆盖现有数据覆盖
:如果数据已经存在,则自动忽略此操作忽略
(默认情况):如果数据已经存在,则引发异常错误
# You can encode credentials in URI or pass
# separately using properties argument
# of jdbc method or options
url = "jdbc:postgresql://localhost/foobar"
properties = {
...
"driver": "org.postgresql.Driver"
}
properties = {
"user": "foo",
"password": "bar"
}
属性
/选项
也可用于设置DataFrame.write.jdbc
df.write.jdbc(url=url, table="baz", mode=mode, properties=properties)
保存数据(有关详细信息,请参阅)- 使用
--包
包含驱动程序时,找不到合适的驱动程序(
) 假设没有驱动程序版本不匹配来解决此问题,您可以将java.sql.SQLException:找不到适合jdbc的驱动程序:…
类添加到驱动程序
。例如:属性
# You can encode credentials in URI or pass # separately using properties argument # of jdbc method or options url = "jdbc:postgresql://localhost/foobar"
properties = { ... "driver": "org.postgresql.Driver" }
- 使用
可能会导致: java.lang.RuntimeException:org.apache.spark.sql.execution.datasources.jdbc.DefaultSource不允许按选择创建表 解决方案未知df.write.format(“jdbc”).options(…).save()
- 在Pyspark 1.3中,您可以尝试直接调用Java方法:
df._jdf.insertIntoJDBC(url, "baz", True)
sqlContext.read.jdbc
:
sqlContext.read.jdbc(url=url, table="baz", properties=properties)
(sqlContext.read.format("jdbc")
.options(url=url, dbtable="baz", **properties)
.load())
或sqlContext.read.format(“jdbc”)
:
- 找不到合适的驱动程序-请参阅:写入数据
- Spark SQL支持JDBC源的谓词下推,尽管并非所有谓词都可以下推。它也不委托限制或聚合。可能的解决方法是用有效的子查询替换
/dbtable
参数。例如,见:table
- 默认情况下,JDBC数据源使用单个执行器线程按顺序加载数据。要确保分布式数据加载,您可以:
- 提供分区
(必须是列
)、整型类型
、下限
、上限
数值分区
- 提供互斥谓词列表,每个所需分区一个
- ,
- ,
- 提供分区
- 在分布式模式下(使用分区列或谓词),每个执行器在其自己的事务中操作。如果同时修改源数据库,则无法保证最终视图的一致性
- (要获取
--软件包所需的坐标,请选择所需版本,并从表格
中的渐变选项卡复制数据,替换相应字段)或:编译组:名称:版本
- 青梅-
- 阿帕奇凤凰-
- Microsoft SQL Server-
- Amazon Redshift-(当前版本仅在专有的Databricks运行时中可用)
spark = SparkSession.builder.appName("prasadad").master('local').config('spark.driver.extraClassPath','D:\spark-2.1.0-bin-hadoop2.7\jars\mysql-connector-java-5.1.41-bin.jar').getOrCreate()
sc = spark.sparkContext
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.format("jdbc").options(url="jdbc:mysql://localhost:3306/sakila",driver="com.mysql.jdbc.Driver",dbtable="actor",user="root",password="****").load()
mysql_url="jdbc:mysql://localhost:3306/sakila?user=root&password=****"
df.write.jdbc(mysql_url,table="actor1",mode="append")
参考此链接下载postgres的jdbc,并按照步骤下载jar文件 jar文件将按如下路径下载。 “/home/anand/.ivy2/jars/org.postgresql\u postgresql-42.1.1.jar” 如果你的spark版本是2
from pyspark.sql import SparkSession
spark = SparkSession.builder
.appName("sparkanalysis")
.config("spark.driver.extraClassPath",
"/home/anand/.ivy2/jars/org.postgresql_postgresql42.1.1.jar")
.getOrCreate()
//for localhost database//
pgDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:postgresql:postgres") \
.option("dbtable", "public.user_emp_tab") \
.option("user", "postgres") \
.option("password", "Jonsnow@100") \
.load()
print(pgDF)
pgDF.filter(pgDF["user_id"]>5).show()
将文件另存为python并运行“python reservivefilename.py”这非常容易使用,难以置信。mode=“overwrite”使用以下命令:spark_submit--driver class path/xx/yy/postgresql-xx.jar my-script.py