通过Hue等远程WebUI界面访问Hive,效率往往受到网络限制,并且不能将Hive数据仓库的内容实现导入导出到本地,因此,今天笔者就通过简单的Scala代码远程连接Hive,查询Hive表数据并将数据转存到本地。另外,用Scala查询到数据后,我们还可以将查询到的ResultSet集合转化为RDD或者DataFrame进行scala的算子运算,非常方便,这些实现,笔者会后续更新。
接下来,我们实现Scala连接服务器上的Hive,导出数据到本地这一功能。
第一步:启动HiveServer2
在服务器端启动hive的远程连接服务,命令如下:
hive --service hiveserver2 10000
启动并指定了服务端口,一般,hive远程连接端口默认配置为10000,因此,也可以直接写为
hive --service hiveserver2
第二步:新建Scala工程,导入Hadoop及Hive的依赖jar包,注意,一定要将所有包导入工程下,否则可能会报错
第三步:import连接包
import java.io.{File, PrintWriter}
import java.sql.DriverManager
import java.sql.SQLException
import java.sql.Connection
import java.sql.ResultSet
import java.sql.Statement
第四步:配置驱动及连接方式
val driverName:String = "org.apache.hadoop.hive.jdbc.HiveDriver"
try {
Class.forName(driverName)
} catch{
case e: ClassNotFoundException =>
println("Missing Class",e)
}
第五步:连接查询,取数据
def main(args: Array[String]): Unit = {
//host为服务器IP,dc_app连接的数据库名
val con:Connection = DriverManager.getConnection("jdbc:hive2://host/dc_app")
val stmt:Statement=con.createStatement()
查询的结果放到的ResultSet
val res:ResultSet = stmt.executeQuery("show tables")
//查看一下都有哪些表格
while (res.next()){
println(res.getString(1))
}
//查询某一张表,放进JSONObject,存入文件
val jSONArray:JSONArray=new JSONArray()
val rs:ResultSet=stmt.executeQuery("select * from dc_app.app_province_sales_mon")
//该表格的列数
println(rs.getMetaData.getColumnCount)
//第一行第一列的列名
println(rs.getMetaData.getColumnName(1))
//写入位置
val writer = new PrintWriter(new File("C:\\Users\\yangt\\Desktop\\es.txt"))
//封装成JSON数组
writer.println("[")
//遍历封装成JSONObject,写入文件
while (rs.next()){
val jSONObject:JSONObject = new JSONObject()
for (i <- 1 to rs.getMetaData.getColumnCount){
if (rs.getObject(i) != null){
jSONObject.put(rs.getMetaData.getColumnName(i).split("\\.")(1),rs.getString(i))
} else {
jSONObject.put(rs.getMetaData.getColumnName(i).split("\\.")(1),"null")
}
}
writer.println(jSONObject+",")
println(jSONObject.toString)
jSONArray.add(jSONObject)
}
writer.println("]")
writer.close()
}