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 表。我的问题是如何表明我想使用某个数据库而不是默认数据库。
在更高版本的 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)
返回创建 HiveContext。Hive 上下文使您能够使用 Hive 的元存储创建数据帧。Spark 仅使用 hive 中的元存储,并不使用 hive 作为检索数据的处理引擎。因此,当您使用 sql 查询创建 df 时,它实际上只是询问 hive 的元存储“数据在哪里,数据的格式是什么”
Spark 获取该信息,并将针对 HDFS 上的底层数据运行进程。所以 Spark 正在执行查询,而不是 hive。
当您创建 sqlContext 时,它会删除 Spark 和 Hive 元存储之间的链接,因此错误表明它不理解您想要执行的操作。
| 归档时间: |
|
| 查看次数: |
15409 次 |
| 最近记录: |