【发布时间】:2015-06-03 19:16:23
【问题描述】:
假设我有一个 PairRDD,students (id, name)。我只想保留 id 在另一个 RDD activeStudents (id) 中的行。
我的解决方案是从 activeStudents (id, id) 创建一个 PairDD,然后与学生一起加入。
有没有更优雅的方式来做到这一点?
【问题讨论】:
标签: join apache-spark rdd
假设我有一个 PairRDD,students (id, name)。我只想保留 id 在另一个 RDD activeStudents (id) 中的行。
我的解决方案是从 activeStudents (id, id) 创建一个 PairDD,然后与学生一起加入。
有没有更优雅的方式来做到这一点?
【问题讨论】:
标签: join apache-spark rdd
这是一个很好的解决方案。如果活跃的学生足够小,您可以将 id 作为地图收集,然后使用 id 存在进行过滤(这样可以避免进行随机播放)。
【讨论】:
就像你想象的那样,如果两个 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
}
【讨论】:
如果您不必加入这两个数据集,那么您绝对应该避免它。 我最近遇到了类似的问题,我使用广播的 Set 成功解决了它,我在 UDF 中使用它来检查每个 RDD 行(而不是其中一个列的值)是否在该 Set 中。然后将该 UDF 用作过滤器转换的基础。
更多:whats-the-most-efficient-way-to-filter-a-dataframe。
希望这会有所帮助。不清楚就问。
【讨论】: