字符串 RDD 连接操作
String RDD join operation
我在 scala 中有字符串 RDD。字符串是 id 的。应该是这样的。
1
2
3
4
我有另一个像这样的 (id, name) RDD。
(1, Name1)
(2, Name2)
(3, Name3)
(4, Name4)
(5, Name5)
(6, Name6)
现在我想获取第一个 RDD 中所有 ID 的名称。我该怎么做?
我意识到如果第一个 RDD 是一个 pairRDD,我可以加入两个 RDD。那么为什么我们只有 pairRDD 的连接操作?
试试这个:
rdd1.map(x => (x, null)).join(rdd2).mapValues(x => x._2)
根据您对 CafeFeeds 回答的评论,如果 ids RDD 足够小,您可以考虑 'broadcast join'。
val ids: RDD[Int] = ???
val names: RDD[(Int, String)] = ???
val bcIds = sc.broadcast(ids.collect.toSet)
val result = names.filter(x => bcIds.value.contains(x._2))
这样做的好处是您不需要对名称 RDD 进行洗牌,因此如果它明显更大,您将大大减少需要完成的工作量。除此之外,简单的连接方法是最好的。
我在 scala 中有字符串 RDD。字符串是 id 的。应该是这样的。
1
2
3
4
我有另一个像这样的 (id, name) RDD。
(1, Name1)
(2, Name2)
(3, Name3)
(4, Name4)
(5, Name5)
(6, Name6)
现在我想获取第一个 RDD 中所有 ID 的名称。我该怎么做?
我意识到如果第一个 RDD 是一个 pairRDD,我可以加入两个 RDD。那么为什么我们只有 pairRDD 的连接操作?
试试这个:
rdd1.map(x => (x, null)).join(rdd2).mapValues(x => x._2)
根据您对 CafeFeeds 回答的评论,如果 ids RDD 足够小,您可以考虑 'broadcast join'。
val ids: RDD[Int] = ???
val names: RDD[(Int, String)] = ???
val bcIds = sc.broadcast(ids.collect.toSet)
val result = names.filter(x => bcIds.value.contains(x._2))
这样做的好处是您不需要对名称 RDD 进行洗牌,因此如果它明显更大,您将大大减少需要完成的工作量。除此之外,简单的连接方法是最好的。