DataFrame registerTempTable(註冊臨時表)後Table Not Found問題的解決
將數據存成數據集的方式是實現數據各種操作非常有效的一種方式。也能夠迅速實現數據的導入與導出。
Spark DataFrame提供了registerTempTable這樣的接口,可以將數據對象存成臨時表,便於後續的各種查詢操作等。如select, join等。
以前都是直接從數據中讀入數據,生成一個dataframe對象,都沒有遇到 table not found的問題。然而今天用手工創建的時候,總是會報這個錯誤。
經過查資料,才發現由於自己的dataframe是用SQLContext創建的,而用HiveContext是無法訪問的。這就涉及到registerTempTable生命週期的問題,以前都沒細看,其生命週期只在所定義的sqlContext或hiveContext實例之中。換而言之,在一個sqlontext(或hiveContext)中registerTempTable的表不能在另一個sqlContext(或hiveContext)中使用。
因此,HiveContext來創建DataFrame就沒有問題。成功解決。
val spark=new HiveContext(sc)
//調用下述的方法,三張虛擬表已經駐留在內存中了,後續的程序直接使用即可
val sql1 = new HiveContext(sc)
MockData.mock(spark.sparkContext,sql1)
//測試:訪問user_visit_action虛擬表中的數據
sql1.sql("select * from product_info").show(100)