首页 文章

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

提问于
浏览
4

我有一个简单的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 回答

  • 2

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

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

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

  • 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
    

相关问题