用JDBC连接其他数据库
Spark SQL还可以使用JDBC访问其他数据库。此功能应优先使用JdbcRDD。由于它返回DataFrame,而DataFrame在Spark SQL中操作更为简单,并且更容易与来自其他数据源的数据交互关联。java和python中使用JDBC数据源也非常简单,无需用户提供其他Class Tag。(请注意,这不同于Spark SQL JDBC server,它支持Spark SQL查询的应用程序。)
第一,您需要将JDBC driver包含在spark classpath中,下面一行包含用于访问postgres的数据库driver:
SPARK_CLASSPATH=postgresql-9.3-1102-jdbc41.jar bin/spark-shell
远程数据库的表可以通过Data Sources API,用DataFrame或者SparkSQL 临时表来装载。以下是选项列表:
属性名
|
含义
|
url
|
需要连接的JDBC URL
|
dbtable
|
需要读取的JDBC表。注意,任何可以填在SQL的where子句中的东西,都可以填在这里。(既可以填完整的表名,也可填括号括起来的子查询语句)
|
driver
|
JDBC driver的类名。这个类必须在master和worker节点上都可用,这样各个节点才能将driver注册到JDBC的子系统中。
|
partitionColumn, lowerBound, upperBound, numPartitions
|
这几个选项,如果指定其中一个,则必须全部指定。他们描述了多个worker如何并行的读入数据,并将表分区。partitionColumn必须是所查询的表中的一个数值字段。注意,lowerBound和upperBound只是用于决定分区跨度的,而不是过滤表中的行。因此,表中所有的行都会被分区然后返回。
|
fetchSize
|
JDBC fetch size,决定每次获取多少行数据。在JDBC驱动上设成较小的值有利于性能优化(如,Oracle上设为10)
|
val jdbcDF = sqlContext.read.format("jdbc").options(
Map("url" -> "jdbc:postgresql:dbserver",
"dbtable" -> "schema.tablename")).load()
FQA
- JDBC driver class必须在所有client session或executor上都可以看到java的本地class loader。那是因为Java的Driver Manager在打开连接前要进行安全性检查,并且忽略所有对原始声音class loader看不到的driver。一种最简单的方法是在所有工人节点上修改compute_classpath.sh,并且包含您需要的driverjar包。
- 有些资料库,比如H2,把名字都改成大写。在Spark SQL中,这些数据库也必须使用大写。