这个问题的目的是记录:
只需稍加改动,这些方法就可以与其他受支持的语言(包括 Scala 和 R)一起使用。
最佳答案
写入数据
--packages
: bin/pyspark --packages group:name:version
或合并
driver-class-path
和 jars
bin/pyspark --driver-class-path $PATH_TO_DRIVER_JAR --jars $PATH_TO_DRIVER_JAR
这些属性也可以使用 PYSPARK_SUBMIT_ARGS
设置JVM 实例启动或使用之前的环境变量 conf/spark-defaults.conf
设置 spark.jars.packages
或 spark.jars
/spark.driver.extraClassPath
.
append
: Append contents of this :class:DataFrame
to existing data.overwrite
: Overwrite existing data.ignore
: Silently ignore this operation if data already exists.error
(default case): Throw an exception if data already exists.
Upserts 或其他细粒度的修改 are not supported
mode = ...
# You can encode credentials in URI or pass
# separately using properties argument
# of jdbc method or options
url = "jdbc:postgresql://localhost/foobar"
properties = {
"user": "foo",
"password": "bar"
}
properties
/options
也可用于设置supported JDBC connection properties .DataFrame.write.jdbc
df.write.jdbc(url=url, table="baz", mode=mode, properties=properties)
保存数据(详情见
pyspark.sql.DataFrameWriter
)。已知问题 :
--packages
包含驱动程序后,找不到合适的驱动程序( java.sql.SQLException: No suitable driver found for jdbc: ...
)假设没有驱动程序版本不匹配来解决这个问题,您可以添加
driver
类到 properties
.例如: properties = {
...
"driver": "org.postgresql.Driver"
}
df.write.format("jdbc").options(...).save()
可能导致:java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource does not allow create table as select.
解决方案未知。
df._jdf.insertIntoJDBC(url, "baz", True)
读取数据
sqlContext.read.jdbc
: sqlContext.read.jdbc(url=url, table="baz", properties=properties)
或
sqlContext.read.format("jdbc")
: (sqlContext.read.format("jdbc")
.options(url=url, dbtable="baz", **properties)
.load())
已知问题和陷阱 :dbtable
/table
带有有效子查询的参数。见例如:column
(必须是 IntegerType
)、lowerBound
, upperBound
, numPartitions
. predicates
, 每个所需分区一个。 看:
在哪里可以找到合适的驱动程序:
--packages
所需的坐标,选择所需的版本并从 Gradle 选项卡中复制数据,格式为 compile-group:name:version
,替换相应的字段)或 Maven Central Repository :其他选项
根据可能存在的数据库专用源,并且在某些情况下是首选:
关于python - (Py)Spark中如何使用JDBC源读写数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30983982/