我有一个简单的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
我正在使用的Spark版本是1.3 . 问题是hive.execution.engine的默认设置是'mr',这使得Hive使用速度慢的MapReduce . 不幸的是我不能强迫它使用“火花” . 我试图通过替换hc = new SQLContext(sc)来使用SQLContext来查看性能是否会提高 . 随着这个改变线
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表一起使用 . 我的问题是如何表明我想使用某个数据库而不是默认数据库 .
2 回答
返回创建HiveContext . hive上下文使您能够使用Hive的Metastore创建数据框 . Spark仅使用来自配置单元的Metastore,并且不使用配置单元作为处理引擎来检索数据 . 因此,当您使用sql查询创建df时,它实际上只是询问hive的Metastore“数据在哪里,以及数据的格式是什么”
Spark接收该信息,并将针对HDFS上的基础数据运行进程 . 所以Spark正在执行查询,而不是hive .
当你创建sqlContext时,它删除了Spark和Hive Metastore之间的链接,所以错误是说它不明白你想要做什么 .
使用数据库
在以后的Spark版本中受支持
https://docs.databricks.com/spark/latest/spark-sql/language-manual/use-database.html
您需要将语句放在两个单独的
spark.sql
调用中,如下所示: