【问题标题】:Counting number of occurrences of Array element in a RDD计算 RDD 中 Array 元素的出现次数
【发布时间】:2018-04-23 20:03:18
【问题描述】:

我有一个带有 [(String, Array[String])] 类型键值对的 RDD1(我将它们称为 (X, Y))和一个数组 Z[String]。 我正在尝试让 Z 中的每个元素计算在 Y 中有多少 X 实例有 Z。我希望我的输出为 ((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]

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

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案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)
    

    【讨论】:

    • 嗨。感谢你及时的答复!假设我得到了答案: ((A, 4), 2) 和 ((A, 1), 3) 如果我现在想将所有 A 值相乘(并且不关心键中的第二个元素) ,所以 A =2*3 我会去:result1 = result..map{case (x, y) => ((x._1), y)}.reduceByKey(_ * _) ?另外,如果我想获得一个键值对,即使它们的值为 0,我将如何做到这一点?
    • 另一个问题:在 _.filter(zs contains _).distinct 中,第一个 _ 指的是键值对,但第二个 _ 指的是值,我不太明白它们为什么指这里有不同的东西。你能解释一下吗?
    猜你喜欢
    • 2018-10-19
    • 2022-11-30
    • 2020-06-09
    • 2020-02-04
    • 2012-06-11
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多