我有一个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]
我不确定我要求的是否可能,或者我是否必须以其他方式进行。
答案 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)