Scala遠端訪問Hive資料倉庫
阿新 • • 發佈:2019-01-22
通過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() }