开发者社区> 问答> 正文

Spark Group By Key to(String,Iterable <String>)

我试图按键将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>为了获得预期结果需要做什么改变。

展开
收起
社区小助手 2018-12-10 16:24:04 2661 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    这就是它与spark中的数据集一起使用的方式。当您拥有类型的数据集时Dataset,可以通过某个映射函数对其进行分组,该函数接受类型为T的对象并返回类型为K的对象(键)。你得到的是一个KeyValueGroupedDataset可以调用聚合函数的函数。在您的情况下,您可以使用mapGroups向您提供将键K和迭代映射Iterable到您选择的新对象R的函数。如果它有帮助,在你的代码中,T是一个Tuple2和K一个URL。

    2019-07-17 23:19:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spark SQL: Past, Present and Future 立即下载
Spark SQL:Past Present &Future 立即下载
低代码开发师(初级)实战教程 立即下载