1. 程式人生 > >Scala遠端訪問Hive資料倉庫

Scala遠端訪問Hive資料倉庫

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