【发布时间】:2017-05-01 17:08:56
【问题描述】:
我正在阅读一个文本文件,其中存储了所有配置单元查询。我需要遍历所有查询并在配置单元数据库上执行它们并将结果存储在配置单元数据库中 代码与输出如下所示。读取 RDD 并调用在 hive db 上执行 SQL 查询并将它们存储在数据库中的方法
[abbi1680@gw01 ~]$ hdfs dfs -put SQLQueries.csv /user/abbi1680/data/SQLQueries50.csv
--HDFS文件
[abbi1680@gw01 ~]$ hdfs dfs -cat /user/abbi1680/data/SQLQueries50.csv
"abbi1680.PPPP","XXXX","select * from abbi1680.tbl1"
"abbi1680.QQQQ","YYYY","select * from abbi1680.tbl2"
scala> def HiveExec(TblName:String,dfName : String,HiveSQL: String) ={
| val dfName = sqlContext.sql(HiveSQL)
| dfName.write.mode("overwrite").saveAsTable(TblName)
| }
HiveExec: (TblName: String, dfName: String, HiveSQL: String)Unit
scala> val ReadQuery =
sc.textFile("/user/abbi1680/data/SQLQueries50.csv").map(line =>
line.split(",")).map(x=>HiveExec(x(0),x(1),x(2)))
ReadQuery: org.apache.spark.rdd.RDD[Unit] = MapPartitionsRDD[3] at
map at <console>:29
hive (default)> use abbi1680;
hive (abbi1680)> show tables;
我希望创建名为 PPPP 和 QQQQ 的表,数据分别为 Tbl1 和 Tbl2。
它没有创建任何表或引发任何错误。
有人可以帮忙吗。
【问题讨论】:
-
请粘贴您遇到的错误。
-
sqlContext是什么类型的对象?它是 HiveContext 还是 SQLContext?
-
我已经执行了这个 Spark shell,不太确定它是哪个上下文。如果我们按如下方式传递变量,它就可以工作,但是当它从 rdd 读取时,它就不起作用了。 val TblName="abbi1680.hottt" val dfName="dfTbl" val HiveSQL="select * from abbi1680.tbl1" HiveExec(TblName,dfName,HiveSQL);
-
您显然必须在某处定义 sqlContext。请包括该行或分享它是什么类型。
-
感谢 Paul,我尝试在方法外和方法内添加上下文。它没有用。它也没有抛出任何错误。请记住,当我们将变量传递给方法时,它会创建表。 val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 以下工作 val TblName="abbi1680.hottt" val dfName="dfTbl" val HiveSQL="select * from abbi1680.tbl1" HiveExec(TblName, dfName,HiveSQL);问题只是当我们使用 RDD 时,它不起作用。
标签: scala apache-spark