2017-01-09 11 views
2

私は、RDD(Long、Foo)のようにリストにフラット化し、最終的にFooの一部であるgetCodeメソッドを呼び出すRDD(Long、util.List [Foo])を持っています。ここに私のアプローチは、これまでspark rddでリストをフラット化する方法は?

val test = source 
    .filter(x => x.getFooList != null) 
    .map(x => (x.getFooList, x.getId)) 
    .map{ 
    case(foo, id) => foo.toArray().map(foo => (foo, id)) 
    } 

ある理想的な私はこの方法が機能する第一の位置

でIDを持っていると思います。しかしtoArrayメソッドはFooからAnyRefに変換します。私はAnyRefでgetCodeメソッドを呼び出すことはできません。これを行う最善の方法は何ですか?あなたはflatMapなくmapを使用する必要がありますあなたのRDDを平らにしたい場合 -

import scala.collection.JavaConverters._ 
... 
case(foo, id) => foo.asScala.map(foo => (foo, id)) 
... 

答えて

2

まず:

+0

'JavaConversions'が推奨とScalaの2.12では非推奨とされていません。 'JavaConverters'を使用してください:https://github.com/scala/scala/pull/5109/files – dk14

1

Listは、この問題を解決することができutil.List Scalaのに変換します。次に、 "id"が最初に来るようにしたい場合は、まず各項目のために構築しているタプルに入れます。そして、第三 - ソースRDDはjava.util.List Sが含まれているので、あなたはScalaのコレクションに(右インポートを暗黙的に行うことができます)それらを変換する必要があります:

import scala.collection.JavaConversions._ // import to get implicit conversion 

val test: RDD[(Long, Foo)] = source 
.filter(x => x.getFooList != null) 
.map(x => (x.getFooList, x.getId)) 
.flatMap { // use flatMap 
    case (foo, id) => foo.map(f => (id, f)) // switch the order 
    } 
関連する問題