Spark JDBC与HIVE - Scala

3

我在HIVE中有一个示例表(stuends1),我想使用JDBC从Spark连接它(因为Hive在AWS上,而不是同一集群中)。我只是试着用以下代码:

def main(args: Array[String]): Unit = {
//Class.forName("org.apache.hive.jdbc.HiveDriver").newInstance()
val conf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[*]")

val sc = new SparkContext(conf)


val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .getOrCreate()

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:hive2://34.223.237.55:10000")
  .option("dbtable", "students1")
  .option("user", "hduser")
  .option("password", "hadoop")
  //.option("driver", "org.apache.hadoop.hive.jdbc.HiveDriver")
  .load()

println("able to connect------------------")

jdbcDF.show

jdbcDF.printSchema()

jdbcDF.createOrReplaceTempView("std")



val sqlDF = spark.sql("select * from std")

println("Start println-----")
spark.sqlContext.sql("select * from std").collect().foreach(println)
println("end println-----")
sqlDF.show(false)
}

我尝试了多种方法,但始终只显示带有列名的表结构。例如...
+--------------+-------------+-------------+
|students1.name|students1.age|students1.gpa|
+--------------+-------------+-------------+
+--------------+-------------+-------------+

我无法获取数据,但是当我尝试使用SQL查询从我的本地使用DBeaver时,可以获取到数据。从Spark中,jdbcDF.printSchema()也正确显示架构,因此我认为连接没有问题。

我正在使用Spark 2.1.1和HIVE 1.2.1。我的sbt.build文件如下....

libraryDependencies ++= Seq(

"log4j"  %   "log4j"  % "1.2.17",
"org.apache.spark" % "spark-core_2.11"                        % "2.1.1" ,
"org.apache.spark" % "spark-streaming-kafka_2.10"             % "1.6.2",
"org.apache.spark" % "spark-hivecontext-compatibility_2.10"   % "2.0.0-preview",
"org.apache.spark" % "spark-sql_2.11"                         % "2.1.1" ,
"org.apache.spark" % "spark-hive_2.10"                        % "2.1.1",
"org.apache.hive"  % "hive-jdbc"                              % "1.2.1"

有人能否建议一下,为什么我没有得到show()的任何输出。提前致谢...


你能发布 jdbcDF.count() 的输出结果吗? - metric-space
奇怪!!! count 是0...这意味着没有数据被拾取了......但是从dbeaver选择 * from students1,显示所有数据。我一定做错了什么..... - Biswajit
使用 MSCK REPAIR TABLE ${tablename} 后输出结果相同。 - Biswajit
@dumitru,由于Spark系统不是我Hadoop集群的一部分 - Biswajit
我尝试使用相同的Spark代码在PostgreSQL和MySQL上运行,两者都正常工作,我猜测是HIVE JDBC驱动程序出了问题... - Biswajit
显示剩余9条评论
1个回答

2
请提及fetchsize属性,它将解决无数据的问题。
fetchsize - JDBC fetch大小,确定每次往返获取多少行。这可以帮助针对低获取大小(例如10行的Oracle)的JDBC驱动程序实现一些性能提升。此选项仅适用于读取操作。
val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:hive2://34.223.237.55:10000")
  .option("dbtable", "students1")
  .option("user", "hduser")
  .option("password", "hadoop")
  .option("fetchsize", "20")
  .load()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接