Spark SQL JDBC


用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中,这些数据库也必须使用大写。