为标记到该键的集合的每个值计算键的数量

时间:2018-09-06 09:01:34

标签: scala apache-spark bigdata rdd data-cleaning

我有一对RDD,像这样:

id   value
id1  set(1232, 3,1,93,35)
id2  set(321,42,5,13)
id3  set(1233,3,5)
id4  set(1232, 56,3,35,5)

现在,我想获取集合中每个值的ID总数。因此,上表的输出应如下所示:

set value  count
    1232   2
    1      1
    93     1
    35     2
    3      3
    5      3
    321    1
    42     1
    13     1
    1233   1
    56     1

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

我建议使用dataframe API,因为它更容易理解。使用此API,可以使用explodegroupBy如下解决问题:

df.withColumn("value", explode($"value"))
  .groupBy("value")
  .count()

使用RDD代替,一种可能的解决方案是使用flatMapaggregateByKey

rdd.flatMap(x => x._2.map(s => (s, x._1)))
  .aggregateByKey(0)((n, str) => n + 1, (p1, p2) => p1 + p2)

两种情况下的结果都是相同的。

答案 1 :(得分:0)

yourrdd.toDF().withColumn(“_2”,explode(col(“_2”))).groupBy(“_2”).count.show