Spark中的聚合键,值对

时间:2018-02-19 21:55:24

标签: java apache-spark aggregate

我有一个带有以下格式的spark数据集:

c1    c2
--------
a     d
a     c
a     d
b     e
b     d

我想做的是得到以下内容(x按计数排序)。

c1           x
-----------------------
a     [(d, 2), (c, 1)]
b     [(e, 1), (d, 1)]

我能够

c1     c2     count
----------------------
a      d      2
a      c      1
b      e      1
b      d      1

通过df.groupBy(c1, c2).count(),但不知道如何从那里继续。 我也探讨了df.groupBy(c1).agg(collect_list(c2)),它给了我

a     [d,c,d]
b     [e,d]

这不是我需要的,根据我的理解,会有问题扩展到大型数据集。

任何帮助?

1 个答案:

答案 0 :(得分:1)

这只是一个草稿,因为我没时间测试它,但你应该知道:

//you initial data
Dataset initialData;
//map values to has set with counts initiali 1 for every element
initialData.map((key, value) => {
  Map<Character, Integer> res = new HashMap<>();
  res.add(value, 1);
  Tuple2<Character, Map<Character, Integer>> tuple = new Tuple2<>(key, res);
  return tuple;
//count elements for given key
}).reduceByKey((map1, map2) => {
  final Map<Character, Integer> res = new HashMap<>();
  res.putAll(map1);
  map2.foreach((key, value) => {
    if (res.contains(key))
      res.put(key, map2(key) + value);
    else
      res.put(key, map2(key));
  }
  return res;
//sort values by count
}.map((key, value) => {
  List<SetEntry<Character, Integer>> entryList = new ArrayList<>(value.entrySet());

  collection.sort(entryList, (entry1, entry2) => 
    entry1.getValue() < entry2.getValue());
  return new Tuple2<>(key, entryList);
}