这是初学者提出的问题。我有一个包含计算机登录信息的文本文件。一旦我过滤坏记录,并映射到我需要的2个元素,我得到的rdd看起来像:
(user10,Server1)
(user40,Server2)
(user20,Server2)
(user25,Server2)
(user30,Server2)
(user30,Server2)
(user71,Server1)
(user10,Server1)
我需要为每个服务器找到唯一用户的数量,我想得到类似的结果:
(server1,2)
(server2,4)
我需要留在Rdd级别;还没有数据框架,我不知道如何继续。任何帮助表示赞赏。
答案 0 :(得分:1)
我为您提供易于理解的解决方案。
def logic(data: RDD[(String, String)]
): RDD[(String, Int)] = {
data
.map { case (user, server) =>
(server, Set(user))
}
.reduceByKey(_ ++ _)
.map { case (server, userSet) =>
(server, userSet.size)
}
}
设置数据结构可用作查找唯一身份用户的工具。
答案 1 :(得分:1)
如果您已将输入文本文件缩减为以下RDD
(user10,Server1)
(user40,Server2)
(user20,Server2)
(user25,Server2)
(user30,Server2)
(user30,Server2)
(user71,Server1)
(user10,Server1)
您需要的最终RDD
类似于网络上丰富的wordcount
示例,但需要一点点技巧。您可以执行以下操作
val finalRdd = rdd.groupBy(x => (x._1, x._2)).map{case(k,v) => k}.map(x => (x._2, 1)).reduceByKey(_+_)
finalRdd
将是
(Server2,4)
(Server1,2)