Spark - 按键分组然后按值计数
Spark - Group by Key then Count by Value
我有使用 map
函数从 RDD Array[String]
创建的非唯一键值对
val kvPairs = myRdd.map(line => (line(0), line(1)))
这会产生格式数据:
1, A
1, A
1, B
2, C
我想按值对所有键进行分组,并提供这些值的计数,如下所示:
1, {(A, 2), (B, 1)}
2, {(C, 1)}
我尝试了很多不同的尝试,但我能得到的最接近的是这样的:
kvPairs.sortByKey().countByValue()
这给
1, (A, 2)
1, (B, 1)
2, (C, 1)
此外,
kvPairs.groupByKey().sortByKey()
提供了价值,但还不够:
1, {(A, A, B)}
2, {(C)}
我尝试将两者结合起来:
kvPairs.countByValue().groupByKey().sortByKey()
但这return一个错误
error: value groupByKey is not a member of scala.collection.Map[(String, String),Long]
只需直接数对,然后分组(如果必须的话):
kvPairs.map((_, 1L))
.reduceByKey(_ + _)
.map{ case ((k, v), cnt) => (k, (v, cnt)) }
.groupByKey
如果您想 gropuByKey
减少后,您可能需要使用自定义分区程序,它只考虑键的第一个元素。您可以查看 示例实现。
我有使用 map
函数从 RDD Array[String]
val kvPairs = myRdd.map(line => (line(0), line(1)))
这会产生格式数据:
1, A
1, A
1, B
2, C
我想按值对所有键进行分组,并提供这些值的计数,如下所示:
1, {(A, 2), (B, 1)}
2, {(C, 1)}
我尝试了很多不同的尝试,但我能得到的最接近的是这样的:
kvPairs.sortByKey().countByValue()
这给
1, (A, 2)
1, (B, 1)
2, (C, 1)
此外,
kvPairs.groupByKey().sortByKey()
提供了价值,但还不够:
1, {(A, A, B)}
2, {(C)}
我尝试将两者结合起来:
kvPairs.countByValue().groupByKey().sortByKey()
但这return一个错误
error: value groupByKey is not a member of scala.collection.Map[(String, String),Long]
只需直接数对,然后分组(如果必须的话):
kvPairs.map((_, 1L))
.reduceByKey(_ + _)
.map{ case ((k, v), cnt) => (k, (v, cnt)) }
.groupByKey
如果您想 gropuByKey
减少后,您可能需要使用自定义分区程序,它只考虑键的第一个元素。您可以查看