假设我有一个PairRDD,学生(身份证,姓名)。我想只保留id在另一个RDD,activeStudents(id)中的行。
我的解决方案是从activeStudents创建一个PairDD,(id,id),并与学生一起做一个连接。
有更优雅的方式吗?
答案 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。
希望这会有所帮助。询问它是否不清楚。