不需要 JDBC
Spark 直接连接到 Hive 元存储,而不是通过 HiveServer2。要配置此功能,
Put hive-site.xml
在你的classpath
,并指定hive.metastore.uri
到您的 Hive 元存储托管的位置。另请参阅如何在 SparkSQL 中以编程方式连接到 Hive 元存储?
Import org.apache.spark.sql.hive.HiveContext
,因为它可以对 Hive 表执行 SQL 查询。
Define val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
Verify sqlContext.sql("show tables")
看看是否有效
Hive 表上的 SparkSQL
结论:如果你必须采用jdbc方式
看一看远程连接 apache Spark 和 apache hive。
请注意,beeline 也通过 jdbc 连接。从你的日志来看,这一点很明显。
[ml@master Spark-2.0.0]$./bin/beeline Beeline 版本 1.2.1.spark2 by
Apache Hive beeline> !connect jdbc:hive2://remote_hive:10000
连接到 jdbc:hive2://remote_hive:10000
所以请看一下这个有趣的文章
- 方法一:使用 JDBC 将表拉入 Spark
- 方法 2:将 Spark JdbcRDD 与 HiveServer2 JDBC 驱动程序结合使用
- 方法三:在客户端获取数据集,然后手动创建RDD
目前HiveServer2驱动不允许我们使用“Sparkling”方法1和2,我们只能依赖方法3
下面是示例代码片段,通过它可以实现
通过 HiveServer2 JDBC 连接将数据从一个 Hadoop 集群(也称为“远程”)加载到另一个集群(我的 Spark 所在的位置,又称为“本地”)。
import java.sql.Timestamp
import scala.collection.mutable.MutableList
case class StatsRec (
first_name: String,
last_name: String,
action_dtm: Timestamp,
size: Long,
size_p: Long,
size_d: Long
)
val conn: Connection = DriverManager.getConnection(url, user, password)
val res: ResultSet = conn.createStatement
.executeQuery("SELECT * FROM stats_201512301914")
val fetchedRes = MutableList[StatsRec]()
while(res.next()) {
var rec = StatsRec(res.getString("first_name"),
res.getString("last_name"),
Timestamp.valueOf(res.getString("action_dtm")),
res.getLong("size"),
res.getLong("size_p"),
res.getLong("size_d"))
fetchedRes += rec
}
conn.close()
val rddStatsDelta = sc.parallelize(fetchedRes)
rddStatsDelta.cache()
// Basically we are done. To check loaded data:
println(rddStatsDelta.count)
rddStatsDelta.collect.take(10).foreach(println)