我认为这可以通过利用 Spark SQL 使用 JDBC 从远程数据库连接和读取数据的能力来实现。
经过详尽的研发,我成功地能够使用 JDBC 连接到两个不同的 Hive 环境,并将 Hive 表作为 DataFrames 加载到 Spark 中以进行进一步处理。
环境细节
hadoop-2.6.0
apache-hive-2.0.0-bin
spark-1.3.1-bin-hadoop2.6
代码示例 HiveMultiEnvironment.scala
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext
object HiveMultiEnvironment {
def main(args: Array[String]) {
var conf = new SparkConf().setAppName("JDBC").setMaster("local")
var sc = new SparkContext(conf)
var sqlContext = new SQLContext(sc)
// load hive table (or) sub-query from Environment 1
val jdbcDF1 = sqlContext.load("jdbc", Map(
"url" -> "jdbc:hive2://<host1>:10000/<db>",
"dbtable" -> "<db.tablename or subquery>",
"driver" -> "org.apache.hive.jdbc.HiveDriver",
"user" -> "<username>",
"password" -> "<password>"))
jdbcDF1.foreach { println }
// load hive table (or) sub-query from Environment 2
val jdbcDF2 = sqlContext.load("jdbc", Map(
"url" -> "jdbc:hive2://<host2>:10000/<db>",
"dbtable" -> "<db.tablename> or <subquery>",
"driver" -> "org.apache.hive.jdbc.HiveDriver",
"user" -> "<username>",
"password" -> "<password>"))
jdbcDF2.foreach { println }
}
// todo: business logic
}
其他参数也可以在加载过程中使用 SqlContext 设置,例如设置 partitionColumn。在 Spark 参考文档中
的“JDBC 到其他数据库”部分中可以找到详细信息: https ://spark.apache.org/docs/1.3.0/sql-programming-guide.html
从 Eclipse 构建路径:
我没试过的
环境 1 使用 HiveContext,环境 2 使用 SqlContext
希望这会有用。