我试图按键将urldata分组,其中值为字符串
样本数据 :
url_3 url_2
url_3 url_2
url_3 url_1
url_4 url_3
url_4 url_1
预期结果:
(url_3,(url_2,url_1))
(url_4,(url_3,url_1))
1)加载urldata:
Dataset lines = spark.read()
.textFile("C:/Users/91984/workspace/myApp/src/test/resources/in/urldata.txt");
2)使用空格拆分数据集
Encoder> encoder2 =
Encoders.tuple(Encoders.STRING(), Encoders.STRING());
Dataset> tupleRDD = lines.map(f->{
Tuple2<String, String> m =
new Tuple2<String, String>(f.split(" ")[0], f.split(" ")[1]);
return m;
},encoder2);
3)使用groupbyKey对密钥上的元组RDD数据库进行分组
KeyValueGroupedDataset> keygrpDS =
tupleRDD.groupByKey(f->f._1, Encoders.STRING());
有人可以解释一下为什么第3步中的groupByKey正在返回 KeyValueGroupedDataset>而不是KeyValueGroupedDataset>为了获得预期结果需要做什么改变。
这就是它与spark中的数据集一起使用的方式。当您拥有类型的数据集时Dataset,可以通过某个映射函数对其进行分组,该函数接受类型为T的对象并返回类型为K的对象(键)。你得到的是一个KeyValueGroupedDataset可以调用聚合函数的函数。在您的情况下,您可以使用mapGroups向您提供将键K和迭代映射Iterable到您选择的新对象R的函数。如果它有帮助,在你的代码中,T是一个Tuple2和K一个URL。