我有一个带有以下格式的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]
这不是我需要的,根据我的理解,会有问题扩展到大型数据集。
任何帮助?
答案 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);
}