#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
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"