微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Spark 中对 RDD 进行排序

如何解决在 Spark 中对 RDD 进行排序

我有一个数据集,列出了客户购买的一般商品。 csv 中的每条记录从左到右列出了客户购买的商品。例如(缩短样本):

Bicycle,Helmet,gloves
Shoes,Jumper,gloves
Television,Hat,Playstation 5

我希望将其放入 Scala 的 RDD 中,并对它们进行计数。

case class SalesItemSummary(SalesItemDesc: String,SalesItemCount: String)
val rdd_1 = sc.textFile("Data/SalesItems.csv")
val rdd_2 = rdd_1.flatMap(line => line.split(",")).countByValue();

以上是一个简短的代码示例。第一行是 case 类(尚未使用)。 第二行从 csv 中获取数据并将其放入 rdd_1。很容易。 第三行做 flatmap,在逗号上拆分数据,然后对每个数据进行计数。因此,例如,上面的“手套”和“跳线”旁边会显示数字 2。其他 1. 看起来像是元组的集合。 到目前为止一切顺利。

接下来,我想对 rdd_2 进行排序以列出购买次数最多的前 3 项。 我可以用 RDD 做到这一点吗?或者我是否需要将 RDD 传输到数据帧中以实现排序? 如果是这样,我该怎么做?

我如何将第 1 行中的 case 类应用到 rdd_2,它似乎是一个元组列表?我应该采取这种方法吗?

提前致谢

解决方法

案例类中的计数应该是一个整数......如果你想将结果保留为 RDD,我建议使用 reduceByKey 而不是 countByValue 返回 {{ 1}} 而不是 RDD。

此外,我建议使用 Map[String,Long] 而不是 , 进行拆分,以避免项目名称中出现前导空格。

,

要对 RDD 进行排序,可以使用 case class SalesItemSummary(SalesItemDesc: String,SalesItemCount: Int) val rdd_1 = sc.textFile("Data/SalesItems.csv") val rdd_2 = rdd_1.flatMap(_.split(",")) .map((_,1)) .reduceByKey(_ + _) .map(line => SalesItemSummary(line._1,line._2)) rdd_2.collect() // Array[SalesItemSummary] = Array(SalesItemSummary(Gloves,2),SalesItemSummary(Shoes,1),SalesItemSummary(Television,SalesItemSummary(Bicycle,SalesItemSummary(Helmet,SalesItemSummary(Hat,SalesItemSummary(Jumper,SalesItemSummary(Playstation 5,1)) :

sortBy

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。