【问题标题】:How to execute hive queries stored in a file and store the results in hive database using Spark application如何使用 Spark 应用程序执行存储在文件中的 hive 查询并将结果存储在 hive 数据库中
【发布时间】: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


【解决方案1】:

感谢您帮助我。

由于我没有太多时间,我选择了一种不同的方法,它有效

以下代码有效。

 cat SQLQueries50.csv
    abbi1680.RKKKK,AAAAA,select * from abbi1680.tbl1
    abbi1680.SPPPP,QQQQQ,select * from abbi1680.tbl2

val ReadQuery = sc.textFile("/user/abbi1680/data/SQLQueries50.csv");
val cnt = ReadQuery.count().toInt

for (line <- ReadQuery.take(cnt)) {
    val cols = line.split(",").map(_.trim)
    val TblName={cols(0)}
    val dfName={cols(1)}
   val HivSQL={cols(2)}
println(s"${TblName}|${dfName}|${HivSQL}")

HiveExec(TblName,dfName,HivSQL);

  }

def HiveExec(TblName:String,dfName : String,HiveSQL: String) ={
     val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
      val dfName = sqlContext.sql(HiveSQL)
      dfName.write.mode("overwrite").saveAsTable(TblName)
      }

我想避免调用 for 循环并使用 map 函数完成任务。没用。

任何帮助将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2021-07-14
    • 2017-01-05
    • 2016-05-02
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多