Spark tempTable问题,表不存在?怎么解决?

时间:2017-01-11 01:31:35

标签: scala apache-spark spark-dataframe

环境:Spark 1.6,Scala

您好
我创建了一个空数据框[sessionTrend],并使用现有数据框[DF2,从SQL Server数据库表创建]进行了unionAll,结果数据帧,sessionTrend工作正常。但是在将sessionTrend数据帧注册为临时表后,由于错误表而无法执行select语句。

val schemaRDD = StructType(
    StructField("SessionCount", IntegerType, true) ::
    StructField("SampleTime", TimestampType, false) ::
    StructField("Program_ID", IntegerType, true) :: Nil)

  var sessionTrend = sqlcontext.createDataFrame(sc.emptyRDD[Row], schemaRDD)

val run_id_q= new Queue[Int]  


for (i <- 1 to 10)
{
     run_id_q += i
    sessionTrend = sessionTrend.unionAll(DF2)  // DF2 is a data set with same schema as sessionTrend 
    if (run_id_q.length >=3) {
      v_run_id = run_id_q.dequeue()
           sessionTrend = sessionTrend.filter(sessionTrend("run_id")>v_run_id)

    }

sessionTrend.show() // working fine and displaying expected result
sessionTrend.registerTempTable("memTBL")
val myData= hivecontext.sql("select * from memTBL") // ERROR: Table memTBL does not exit

}

有任何解决此问题的建议吗?实际上,我正在尝试创建一个总是有最新3条记录的数据框。

感谢
侯塞因

1 个答案:

答案 0 :(得分:-1)

由于您的数据框sessionTrend是从sqlContext

创建的
var sessionTrend = sqlcontext.createDataFrame(sc.emptyRDD[Row], schemaRDD)

并尝试使用hiveContext访问临时表。使用hiveContext创建数据框或使用sqlContext访问表,如下所示。

val myData= sqlContext.sql("select * from memTBL")

基本上,关键是你应该使用其中一个进行操作而不是混合它。