通过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() }