我有一个简单的Scala代码,该代码从Hive数据库中检索数据并从结果集中创建RDD。HiveContext可以正常工作。该代码与此相似:
val hc = new HiveContext(sc)
val mySql = "select PRODUCT_CODE, DATA_UNIT from account"
hc.sql("use myDatabase")
val rdd = hc.sql(mySql).rdd
我正在使用的火花的版本为1.3。问题在于hive.execution.engine的默认设置是" MR",它使Hive使用慢速的MapReduce。不幸的是,我不能强迫它使用"火花"。我尝试通过更换HC = new SQLContext(SC)来查看性能是否会改善。随之而来的是行
hc.sql("use myDatabase")
正在抛出以下例外:
Exception in thread "main" java.lang.RuntimeException: [1.1] failure: ``insert'' expected but identifier use found
use myDatabase
^
Spark 1.3文档说SparkSQL可以与Hive Tables一起使用。我的问题是如何指出我要使用某个数据库而不是默认数据库。
使用数据库
在以后的Spark版本中支持
https://docs.databricks.com/spark/latest/spark-sql/language-manual/use-database.html
您需要将语句放入两个单独的spark.sql
调用中:
spark.sql("use mydb")
spark.sql("select * from mytab_in_mydb").show
回到创建hiveContext。Hive上下文使您能够使用Hive的Metastore创建数据框。Spark仅使用Hive的Metastore,并且不使用Hive作为处理引擎来检索数据。因此,当您使用SQL查询创建DF时,它实际上只是在问Hive的Metastore"数据在哪里,以及数据的格式是什么"
Spark获取这些信息,并将针对HDFS上的基础数据运行。因此,Spark正在执行查询,而不是Hive。
当您创建SQLContext时,它删除了Spark和Hive Metastore之间的链接,因此错误是说它不了解您想做什么。
我无法实现使用databale命令,但这是使用所需数据库的解决方法:
spark-shell --queue QUEUENAME;
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
val res2 = sqlContext.sql("select count(1) from DB_NAME.TABLE_NAME")
res2.collect()