我有一个简单的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可以使用配置单元表。我的问题是如何表明我想使用某个数据库而不是默认数据库。
3条答案
按热度按时间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()
qxsslcnc2#
使用数据库
在以后的spark版本中受支持
https://docs.databricks.com/spark/latest/spark-sql/language-manual/use-database.html
你需要把这个陈述分成两部分
spark.sql
像这样的电话:xfb7svmp3#
返回到创建hivecontext。配置单元上下文使您能够使用配置单元的元存储创建Dataframe。spark只使用hive中的元存储,不使用hive作为检索数据的处理引擎。因此,当您使用sql查询创建df时,实际上只是询问hive的元存储“数据在哪里,数据的格式是什么”
spark获取这些信息,并对hdfs上的底层数据运行进程。所以spark是在执行查询,而不是hive。
当您创建sqlcontext时,它会删除spark和hive元存储之间的链接,因此错误是它不理解您要做什么。