火花

2016-12-13 184 views
0

如何flatmap嵌套的列表我有一个RDD火花就像这样 -火花

[Foo1, Bar[bar1,bar2]] 

酒吧对象有一个的GetList方法,其可以返回列表[bar11,bar12,bar13]和[bar21 ,bar22]。我所要的输出是这样的 -

[Foo1, [bar11, bar12, bar13, bar21, bar22]] 

,我能想到的方法是这样的 -

my_rdd.map(x => (x._1,x._2.getList)) 
    .flatmap{ 
     case(x,y) => y.map(x, _) 
    } 

的第一张地图操作返回我Foo1和所有的名单。然而,我无法将它们压扁。

回答

0

在您的代码中,x._2.getList返回列表的列表。
my_rdd.map(X =>(x._1,x._2.getList.flatten))

1

你可以用一条线做到这一点:

my_rdd.mapValues(_.flatMap(_.getList)) 
如下有预期的结果利用压扁方法

还有另一个使用map而不是mapValues的答案。虽然这会产生相同的RDD元素,但我认为在使用Spark RDD所需的“最小化”功能的实践中很重要,因为实际上如果不意识到使用map而不是mapValues,您可能会付出相当大的性能成本 - RDD上的map函数会删除分区程序(如果存在),并且mapValues不会。

如果您有一个RDD[(K, V)]并致电rdd.groupByKey(),那么最终的RDD[(K, Array[V])]将被K分区。如果你想join与另一个RDD K,你已经完成了大部分工作。

如果在groupByKey()join之间添加map,则Spark将重新洗牌该RDD。这非常痛苦! mapValues是安全的。