【问题标题】:How to filter RDDs using count of keys in a map如何使用地图中的键数过滤 RDD
【发布时间】:2017-01-11 13:26:10
【问题描述】:

我有以下 RDD

val reducedListOfCalls: RDD[(String, List[Row])]

RDD 是:

[(923066800846, List[2016072211,1,923066800846])]

[(923027659472, List[2016072211,1,92328880275]),
  923027659472, List[2016072211,1,92324440275])]

[(923027659475, List[2016072211,1,92328880275]),
 (923027659475, List[2016072211,1,92324430275]),
 (923027659475, List[2016072211,1,92334340275])]

如上图,第一个 RDD 有 1 个 (key,value) 对,第二个有 2 个,第三个有 3 个对。

我想删除所有少于 2 个键值对的 RDD。预期的结果RDD是:

[(923027659472, List[2016072211,1,92328880275]),
  923027659472, List[2016072211,1,92324440275])]

[(923027659475, List[2016072211,1,92328880275]),
 (923027659475, List[2016072211,1,92324430275]),
 (923027659475, List[2016072211,1,92334340275])]

我尝试了以下方法:

val reducedListOfCalls = listOfMappedCalls.filter(f => f._1.size >1)

但它仍然只给出原始列表。过滤器似乎没有任何区别。

是否可以统计一个映射的RDD中key的数量,然后根据key的数量进行过滤?

【问题讨论】:

  • 在您的示例中,您显示了 List ,其中包含相同键的相同元素。你试过 reducebykey 吗?
  • 键是相同的,但值是不同的,如您所见。我需要所有值,当键数 > 1 时,reduceByKey 对此不起作用
  • 这些都是同一个RDD的打印吗?看起来您的 List[Row] 不是持有这些多个元组的人,看起来 RDD 内部只是包含不同数量的元组。
  • 为什么不直接使用count,即listOfMappedCalls.filter(_.count >= 2)

标签: scala apache-spark


【解决方案1】:

您可以在 Spark 中使用aggregateByKey 来计算键的数量。

你应该在你的 combine 函数中创建一个Tuple2(count, List[List[Row]])reduceByKey也可以达到同样的效果。

阅读this 比较这两个函数的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多