2017-08-08 28 views
2

我有火花數據集<行代表一個表>如何在不分組值的情況下對火花數據集執行按值操作進行計數?

origin.show(); 

+------+ 
|Origin| 
+------+ 
| USA| 
| Japan| 
| USA| 
| USA| 
| Japan| 
|Europe| 
+------+ 

我要建立額外的「countByValue」欄目獲得表像

+------+-----+ 
|Origin|Count| 
+------+-----+ 
|Europe| 1| 
| USA| 3| 
| USA| 3| 
| USA| 3| 
| Japan| 2| 
| Japan| 2| 
+------+-----+ 

我找到解決辦法,但它似乎非常低效。我分組原點數據集並使用計數功能。

Dataset<Row> grouped = origin.groupBy(originCol).agg(functions.count(originCol)); 
grouped.show(); 

+------+-----+ 
|Origin|Count| 
+------+-----+ 
|Europe| 1| 
| USA| 3| 
| Japan| 2| 
+------+-----+ 

然後我只是加入結果表與原始數據集。

Dataset<Row> finalDs = origin.join(grouped, originCol); 

是否有其他更有效的方法來執行此類操作?

回答

4

您可以使用Window編寫查詢:

origin.withColumn("cnt", count('Origin).over(Window.partitionBy('Origin))) 

記得導入org.apache.spark.sql.functions._org.apache.spark.sql.expressions.Window

0

,如果你要更新原有數據幀的計數,你可以按照T. Gaweda的回答你不需要join,你可以做

import org.apache.spark.sql.functions._ 
origin.groupBy("Origin").agg(count("Origin").as("Count")) 

編輯

import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.expressions.Window 
origin.withColumn("Count", count("Origin").over(Window.partitionBy("Origin"))) 
+0

會產生分組表,例如,在它上面將產生3行的表,但我想得到一個與原來的大小 –

+0

它的答案由T. Gaweda :)表請檢查 –

1

這是你需要做什麼

org.apache.sql.functions._ 

val df = Seq(
    ("USA"), 
    ("Japan"), 
    ("USA"), 
    ("USA"), 
    ("Japan"), 
    ("Europe") 
).toDF("origin") 


val result = df.groupBy("origin").agg(collect_list($"origin").alias("origin1"), 
    count("origin").alias("count")) 
    .withColumn("origin", explode($"origin1")).drop("origin") 
相關問題