1
case class Step (Id : Long, 
       stepNum : Long, 
       stepId : Int, 
       stepTime: java.sql.Timestamp 
       ) 

データセット[ステップ]があり、「Id」列に対してgroupBy操作を実行したいとします。 私の出力はDataset [(Long、List [Step])]のようになります。これはどうすればいいですか?Spark GroupBy集計関数

val inquiryStepGrouped: RDD[(Long, Iterable[Step])] = inquiryStepMap.rdd.groupBy(x => x.Id) 

答えて

1

を次のように私たちはRDDSでこれを行うことができます。[ステップ]変数 "inquiryStepMapは" タイプデータセットであると言うことができますあなたがgroupByKeyを必要とするようだ:

サンプル:

import java.sql.Timestamp  
val t = new Timestamp(2017, 5, 1, 0, 0, 0, 0)  
val ds = Seq(Step(1L, 21L, 1, t), Step(1L, 20L, 2, t), Step(2L, 10L, 3, t)).toDS() 

groupByKeymapGroups

ds.groupByKey(_.Id).mapGroups((Id, Vals) => (Id, Vals.toList)) 
// res18: org.apache.spark.sql.Dataset[(Long, List[Step])] = [_1: bigint, _2: array<struct<Id:bigint,stepNum:bigint,stepId:int,stepTime:timestamp>>] 

、結果は次のようになります。

ds.groupByKey(_.Id).mapGroups((Id, Vals) => (Id, Vals.toList)).show() 
+---+--------------------+ 
| _1|     _2| 
+---+--------------------+ 
| 1|[[1,21,1,3917-06-...| 
| 2|[[2,10,3,3917-06-...| 
+---+--------------------+