如何删除其键不在另一个RDD中的RDD行?

时间:2015-06-03 19:16:23

标签: join apache-spark rdd

假设我有一个PairRDD,学生(身份证,姓名)。我想只保留id在另一个RDD,activeStudents(id)中的行。

我的解决方案是从activeStudents创建一个PairDD,(id,id),并与学生一起做一个连接。

有更优雅的方式吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

就像你想的那样,如果两个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
  }

答案 2 :(得分:0)

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

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

希望这会有所帮助。询问它是否不清楚。