【问题标题】:How do I remove rows of an RDD whose key is not in another RDD?如何删除键不在另一个 RDD 中的 RDD 行?
【发布时间】:2015-06-03 19:16:23
【问题描述】:

假设我有一个 PairRDD,students (id, name)。我只想保留 id 在另一个 RDD activeStudents (id) 中的行。

我的解决方案是从 activeStudents (id, id) 创建一个 PairDD,然后与学生一起加入。

有没有更优雅的方式来做到这一点?

【问题讨论】:

    标签: join apache-spark rdd


    【解决方案1】:

    这是一个很好的解决方案。如果活跃的学生足够小,您可以将 id 作为地图收集,然后使用 id 存在进行过滤(这样可以避免进行随机播放)。

    【讨论】:

      【解决方案2】:

      就像你想象的那样,如果两个 RDD 都包含键和值,你可以进行外连接。

      val students: RDD[(Long, String)]
      val activeStudents: RDD[Long]
      val activeMap: RDD[(Long, Unit)] = activeStudents.map(_ -> ())
      val activeWithName: RDD[(Long, String)] =
        students.leftOuterJoin(activeMap).flatMapValues {
          case (name, Some(())) => Some(name)
          case (name, None) => None
        }
      

      【讨论】:

        【解决方案3】:

        如果您不必加入这两个数据集,那么您绝对应该避免它。 我最近遇到了类似的问题,我使用广播的 Set 成功解决了它,我在 UDF 中使用它来检查每个 RDD 行(而不是其中一个列的值)是否在该 Set 中。然后将该 UDF 用作过滤器转换的基础。

        更多:whats-the-most-efficient-way-to-filter-a-dataframe

        希望这会有所帮助。不清楚就问。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-23
          • 1970-01-01
          • 1970-01-01
          • 2016-11-21
          • 1970-01-01
          相关资源
          最近更新 更多