如何在spark 1.3中通过配置单元指示sparksql中的数据库

wmtdaxz3  于 2021-06-29  发布在  Hive
关注(0)|答案(3)|浏览(288)

我有一个简单的scala代码,它从配置单元数据库检索数据,并从结果集中创建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的速度很慢。不幸的是,我不能强迫它使用“Spark”。我尝试通过替换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
^

spark1.3文档说明sparksql可以使用配置单元表。我的问题是如何表明我想使用某个数据库而不是默认数据库。

0yg35tkg

0yg35tkg1#

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

qxsslcnc

qxsslcnc2#

使用数据库

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

xfb7svmp3#

返回到创建hivecontext。配置单元上下文使您能够使用配置单元的元存储创建Dataframe。spark只使用hive中的元存储,不使用hive作为检索数据的处理引擎。因此,当您使用sql查询创建df时,实际上只是询问hive的元存储“数据在哪里,数据的格式是什么”
spark获取这些信息,并对hdfs上的底层数据运行进程。所以spark是在执行查询,而不是hive。
当您创建sqlcontext时,它会删除spark和hive元存储之间的链接,因此错误是它不理解您要做什么。

相关问题