计算RDD中Array元素的出现次数

时间:2018-04-23 11:29:39

标签: scala apache-spark rdd

我有一个RDD1,键值对为[(String, Array[String])](我将它们称为(X,Y)),还有一个数组Z [String]。 我正在尝试用Z中的每个元素来计算在Y中有多少个X实例。我希望我的输出为((X,Z(i)),#ofinstances)。

RDD1= ((A, (2, 3, 4), (B, (4, 4, 4)), (A, (4, 5)))
Z = (1, 4)

然后我想得到:

(((A, 4), 2), ((B, 4), 1))

希望有道理。 正如你所看到的,我只想要一个元素,如果至少有一个出现。

到目前为止我已尝试过这个:

val newRDD = RDD1.map{case(x, y) => for(i <- 0 to (z.size-1)){if(y.contains(z(i))) {((x, z(i)), 1)}}}

我的输出是RDD [Unit]

我不确定我要求的是否可能,或者我是否必须以其他方式进行。

1 个答案:

答案 0 :(得分:1)

所以这只是另一个字数

val rdd = sc.parallelize(Seq(
   ("A", Array("2", "3", "4")), 
   ("B", Array("4", "4", "4")),
   ("A", Array("4", "5"))))

val z = Array("1", "4")

要使查找有效地将z转换为Set

val zs = z.toSet

val result = rdd
  .flatMapValues(_.filter(zs contains _).distinct)
  .map((_, 1))
  .reduceByKey(_ + _)

其中

_.filter(zs contains _).distinct

过滤掉z中发生的值并进行重复数据删除。

result.take(2).foreach(println)
// ((B,4),1)
// ((A,4),2)