火花

2016-12-13 182 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是安全的。