2016-09-08 20 views
5

我有一個包含類似下面的數據的數據集:GroupByKey在星火2.0數據集使用Java

|c1| c2| 
--------- 
| 1 | a | 
| 1 | b | 
| 1 | c | 
| 2 | a | 
| 2 | b | 

...

現在,我想分組像下面(COL1數據:字符串鍵,COL2:列表)

| c1| c2 | 
----------- 
| 1 |a,b,c| 
| 2 | a, b| 
... 

我想到用goupByKey將是一個足夠的解決方案,但我找不到任何例子,如何使用它。

任何人都可以幫助我找到一個解決方案,使用groupByKey或使用任何其他組合的轉換和行動來獲得這個輸出通過使用數據集,而不是RDD?

回答

2

這裏是火花2.0,並用數據集的Java實例。

public class SparkSample { 
    public static void main(String[] args) { 
    //SparkSession 
    SparkSession spark = SparkSession 
      .builder() 
      .appName("SparkSample") 
      .config("spark.sql.warehouse.dir", "/file:C:/temp") 
      .master("local") 
      .getOrCreate();  
    //input data 
    List<Tuple2<Integer,String>> inputList = new ArrayList<Tuple2<Integer,String>>(); 
    inputList.add(new Tuple2<Integer,String>(1, "a")); 
    inputList.add(new Tuple2<Integer,String>(1, "b")); 
    inputList.add(new Tuple2<Integer,String>(1, "c")); 
    inputList.add(new Tuple2<Integer,String>(2, "a")); 
    inputList.add(new Tuple2<Integer,String>(2, "b"));   
    //dataset 
    Dataset<Row> dataSet = spark.createDataset(inputList, Encoders.tuple(Encoders.INT(), Encoders.STRING())).toDF("c1","c2"); 
    dataSet.show();  
    //groupBy and aggregate 
    Dataset<Row> dataSet1 = dataSet.groupBy("c1").agg(org.apache.spark.sql.functions.collect_list("c2")).toDF("c1","c2"); 
    dataSet1.show(); 
    //stop 
    spark.stop(); 
    } 
} 
+0

很高興我能幫忙。 – abaghel

+0

謝謝,它的作品! –

1

隨着火花2.0數據幀:

scala> val data = List((1, "a"), (1, "b"), (1, "c"), (2, "a"), (2, "b")).toDF("c1", "c2") 
data: org.apache.spark.sql.DataFrame = [c1: int, c2: string] 
scala> data.groupBy("c1").agg(collect_list("c2")).collect.foreach(println) 
[1,WrappedArray(a, b, c)] 
[2,WrappedArray(a, b)] 
0

這將在讀取表中的數據集變量

Dataset<Row> datasetNew = dataset.groupBy("c1").agg(functions.collect_list("c2")); 
datasetNew.show()