如何在Spark 1.3中通过Hive在SparkSQL中指示数据库

时间:2016-06-21 18:46:21

标签: database apache-spark hive apache-spark-sql

我有一个简单的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表一起使用。我的问题是如何表明我想使用某个数据库而不是默认数据库。

3 个答案:

答案 0 :(得分:3)

使用数据库

在以后的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

答案 1 :(得分:2)

返回创建HiveContext。 hive上下文使您能够使用Hive的Metastore创建数据框。 Spark仅使用来自配置单元的Metastore,并且不使用配置单元作为处理引擎来检索数据。因此,当您使用sql查询创建df时,它实际上只是询问hive的Metastore"数据在哪里,以及数据的格式"

Spark获取该信息,并将针对HDFS上的基础数据运行进程。所以Spark正在执行查询,而不是hive。

当你创建sqlContext时,它删除了Spark和Hive Metastore之间的链接,所以错误是说它不知道你想要做什么。

答案 2 :(得分:-1)

我无法实现use 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()