Spark Scala - 按键

时间:2017-11-12 22:18:19

标签: scala unique rdd

这是初学者提出的问题。我有一个包含计算机登录信息的文本文件。一旦我过滤坏记录,并映射到我需要的2个元素,我得到的rdd看起来像:

 (user10,Server1)
 (user40,Server2)
 (user20,Server2)
 (user25,Server2)
 (user30,Server2)
 (user30,Server2)
 (user71,Server1)
 (user10,Server1)

我需要为每个服务器找到唯一用户的数量,我想得到类似的结果:

(server1,2) (server2,4)

我需要留在Rdd级别;还没有数据框架,我不知道如何继续。任何帮助表示赞赏。

2 个答案:

答案 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)