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

Mic*_*l D 5 database hive apache-spark 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
Run Code Online (Sandbox Code Playgroud)

我使用的 Spark 版本是 1.3。问题是 hive.execution.engine 的默认设置是“mr”,这使得 Hive 使用 MapReduce 很慢。不幸的是,我不能强迫它使用“火花”。我尝试通过替换 hc = new SQLContext(sc) 来使用 SQLContext 以查看性能是否会提高。有了这个改变线

hc.sql("use myDatabase")
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

Exception in thread "main" java.lang.RuntimeException: [1.1] failure: ``insert'' expected but identifier use found

use myDatabase
^
Run Code Online (Sandbox Code Playgroud)

Spark 1.3 文档说 SparkSQL 可以使用 Hive 表。我的问题是如何表明我想使用某个数据库而不是默认数据库。

jav*_*dba 6

使用数据库

在更高版本的 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
Run Code Online (Sandbox Code Playgroud)


Joe*_*den 3

返回创建 HiveContext。Hive 上下文使您能够使用 Hive 的元存储创建数据帧。Spark 仅使用 hive 中的元存储,并不使用 hive 作为检索数据的处理引擎。因此,当您使用 sql 查询创建 df 时,它实际上只是询问 hive 的元存储“数据在哪里,数据的格式是什么”

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

当您创建 sqlContext 时,它会删除 Spark 和 Hive 元存储之间的链接,因此错误表明它不理解您想要执行的操作。