2016-06-13 55 views
0

我想要計算類似於下面的SQL查詢在分組字段的平均值AVG:星火org.apache.spark.sql.DataFrame:如何計算的第2列

select count(*) as total_count 
from tbl1 
where col2 is NULL; 

select col3, count(*)/total_count as avg_count 
from tbl1 
where col2 is NULL 
group by col3; 

請找星火我經歷的陳述。我已經有了total_count

val df = sqlContext.read.parquet("/user/hive/warehouse/xxx.db/fff") 
val badDF = df.filter("col2 = ' '").withColumn("INVALID_COL_NAME", lit("XXX")) 
val badGrp1 = df.groupBy("col3").count() 
val badGrp2 = badGrp1.select(col("col3"),col("count").as("CNT")) 

現在能找到avg CNT/total_count,該怎麼做?

我試過地圖和行,它沒有工作。

val badGrp3 = badGrp2.map(row => Row(row._1, row._2/20)) ---> for now I am assuming 20 as total_count. 

有人能請建議如何繼續?

謝謝。

回答

1

我不知道很多關於斯卡拉但是從你的代碼,我認爲你已經算是作爲斯卡拉Tuple在這行代碼:

val badGrp3 = badGrp2.map(row => Row(row._1, row._2/20))

要從火花獲取數據你可以使用的方法,就像:

// suppose you are getting the 1st and 2nd value of row 
// where the 2nd value (count) is a Long type value 
row => Row(row.get(0), row.getLong(1)/20) 
+0

謝謝袁基。 – Aavik

+0

你的回答對我有幫助,我會投票。 問題:Row函數屬於哪個包?它給我錯誤:找不到:值行。我編碼如下: val badGrp3 = badGrp1.map(row => Row(row.get(0),row.getLong(1)/ 20) 此外,如果我必須遍歷所有的Dataframe行,如何做到這一點? 我想調用DF的每一行的方法。 – Aavik

+0

它是'org.apache.spark.sql.Row'你可以看到[here](http://spark.apache.org/docs /1.6.0/api/scala/index.html#org.apache.spark.sql.Row) –