Как подключить hive в программе scala

#scala

#scala

Вопрос:

У меня есть требование, согласно которому мы должны вызывать таблицы hive в scala, которые находятся вне spark.

Есть ли способ, которым мы можем вызвать таблицу hive из среды spark, используя программирование на scala.

Работает ли этот пример программы или требуются какие-либо изменения.

 import java.io.IOException
import scala.util.Try
import org.apache.hadoop.hive.cli.CliSessionState
import org.apache.hadoop.hive.conf.HiveConf
import org.apache.hadoop.hive.ql.Driver
import org.apache.hadoop.hive.ql.session.SessionState

class getData {
  val hiveConf = new HiveConf(classOf[getData])

  private def getDriver: Driver = {
    val driver = new Driver(hiveConf)
    SessionState.start(new CliSessionState(hiveConf))
    driver
  }

  def executeHQL(hql: String): Int = {
    val responseOpt = Try(getDriver.run(hql)).toEither
    val response = responseOpt match {
      case Right(response) => response
      case Left(exception) => throw new Exception(s"${ exception.getMessage }")
    }
    val responseCode = response.getResponseCode
    if (responseCode != 0) {
      val err: String = response.getErrorMessage
      throw new IOException("Failed to execute hql ["   hql   "], error message is: "   err)
    }
    responseCode
  }
}
  

Ответ №1:

Вы можете использовать разъем Hive JDBC для подключения hive из программы scala.

https://cwiki.apache.org/confluence/display/Hive/HiveServer2 Clients#HiveServer2Clients-JDBC

https://community.hortonworks.com/questions/156777/connecting-hive-using-jdbc-connector-from-scala.html

 import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveJdbcClient extends App {
    val driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

    Class.forName(driverName);

    val con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
    val stmt = con.createStatement();
    val tableName = "testHiveDriverTable";
    stmt.executeQuery("drop table "   tableName);
    val res = stmt.executeQuery("create table "   tableName   " (key int, value string)");

    // select * query
    val sql = "select * from "   tableName;
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(String.valueOf(res.getInt(1))   "t"   res.getString(2));
    }

    // regular hive query
    val sql = "select count(1) from "   tableName;
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1));
    }
  }
}
  

Комментарии:

1. в EMR это как должно быть val driverName = "org.apache.hive.jdbc.HiveDriver"