2016-12-07 20 views
-1

如何在讀取每個文件後,我需要將fileName作爲數據框中的字段添加時,使用我所有的json文件創建Dataframe?似乎for循環中的Variable無法在循環外識別。如何解決這個問題?Scala:如何在循環塊外使用變量

for (jsonfilenames <- fileArray) { 
     var df = hivecontext.read.json(jsonfilename) 
     var tblLanding = df.withColumn("source_file_name", lit(jsonfilename)) 

    } 

    // trying to create temp table from dataframe created in loop 

tblLanding.registerTempTable("LandingTable") // ERROR here, can't resolved tblLanding 

預先感謝
侯賽因

回答

0
// Create list of dataframes with source-file-names 
val dfList = fileArray.map{ filename => 
    hivecontext.read.json(filename) 
      .withColumn("source_file_name", lit(filename)) 
} 

// union the dataframes (assuming all are same schema) 
val df = dfList.reduce(_ unionAll _) // or use union if spark 2.x 

// register as table 
df.registerTempTable("LandingTable") 
+0

謝謝@Shyamendra Solanki!這是我正在尋找的。我測試了你的代碼。它的工作原理! – Jhon

+0

很高興有幫助。請考慮接受答案:http://stackoverflow.com/help/accepted-answer –

1

我認爲你是新的編程本身。 反正在這裏,你去。

基本上你指定了類型並在循環之前初始化它。

var df:DataFrame = null 
for (jsonfilename <- fileArray) { 
     df = hivecontext.read.json(jsonfilename) 
     var tblLanding = df.withColumn("source_file_name", lit(jsonfilename)) 

    } 

df.registerTempTable("LandingTable") // Getting ERROR here 

更新

好吧,你是完全新的節目,甚至循環。

假設fileArray通過讀取4個JSON文件具有值[1.json,2.json,3.json,4.json]

所以,環路實際創建4數據幀。 你想註冊爲臨時表的那一個。

如果所有的人,

var df:DataFrame = null 
var count = 0 
for (jsonfilename <- fileArray) { 
     df = hivecontext.read.json(jsonfilename) 
     var tblLanding = df.withColumn("source_file_name", lit(jsonfilename)) 
     df.registerTempTable(s"LandingTable_$count") 
     count++; 
    } 

而且理由DF爲空在此之前更新,您fileArray爲空或星火無法讀取該文件。打印並檢查。

查詢任何登記在冊的LandingTable

val df2 = hiveContext.sql("SELECT * FROM LandingTable_0") 

更新 問題發生了變化,從所有的JSON文件製作一個數據幀的。

var dataFrame:DataFrame = null 
for (jsonfilename <- fileArray) { 
    val eachDataFrame = hivecontext.read.json(jsonfilename) 
    if(dataFrame == null) 
     dataFrame = eachDataFrame 
    else 
     dataFrame = eachDataFrame.unionAll(dataFrame) 
} 
dataFrame.registerTempTable("LandingTable") 

確保fileArray不爲空,並且fileArray中的所有json文件具有相同的架構。

+0

感謝您的回覆。我相信, – Jhon

+0

感謝您的迴應。請注意,我正在創建temp循環的臨時表,並在for循環中創建了DataFrame。我相信,var df:DataFrame = null在beaning中與我在for循環中創建的不同。當嘗試df.show()時,我得到了NullPointerException。期待謹慎的迴應。 – Jhon

+0

再次感謝您的時間。我覺得,我無法讓你理解我的問題。首先,我需要一個包含所有json文件的表格。其次,我需要從for循環塊中訪問該表。請注意,我無法避免循環將DF添加到DF列。 – Jhon