2016-10-20 6 views
0

apache SparkでJava + Scalaを使用する。 私はヘルパークラスを使用してスカラグラフに変換javaRDDsの一部の文字列データ(textdata変数)を有する:nullを取得する収集後にスパークマップ操作のグラフフィールド

SparkConf = new SparkConf(true); // also set parameters, etc 
JavaSparkContext sc = new JavaSparkContext(conf); 
JavaRDD<Graph<String, Object>> graphs = textdata.map(new GraphConverterClass(JavaSparkContext.toSparkContext(sc))); 

List<Graph<String,Object>> graphsList = graphs.collect(); 

コンバータクラスは、機能インタフェースを実装し、それが呼び出しがあります

public Graph<String, Object> call(String data) 
{ 
Graph<String,object> mygraph = someFunc(data,sc); 
return mygraph; 
} 

これを実行すると、コンバータークラスの中で私はmygraphの結果を見ることができます。

しかし、ドライバプログラムで収集するリストでは、グラフの数が正しくても、それぞれの頂点と辺のフィールドはnullです。

上記のシナリオでGraphの代わりに別のダミークラスを使用すると、そのフィールドの値が保持されます。

なぜグラフオブジェクトが正しく収集されないのですか?

答えて

2

textDataがRDDの場合、mapのSparkContextで閉じる関数はサポートされていません。

SparkContextは、排他的にドライバに存在するオブジェクトであり、エグゼキュータでは「null」です。同じ問題は、その演算の結果の型でスポッティングすることが可能

(それがSerializationExceptionを与えないことは驚くべきことだ): JavaRDD<Graph<String, Object>>ネストされたRDDSは概念的に定義されていません。

可能な解決策の1つは、VerticesとEdges RDDを作成し、Graphコンストラクタを使用してターゲットグラフを構築するという観点からプロセスを再考することです。

+0

私は、コンバータクラスの中で 'private static transient SparkContext sc;'としてsparkコンテキストを宣言し、それをドライバから引数として渡しました。一時的なものがシリアル化されていなければ、それでも問題はありますか? – npit

+0

さらに、コンバータクラスのメソッドでは、sparkコンテキストがnullではありません。そこのグラフはいいです、私はちょうどそれを運転手にそのまま渡すことができません。 – npit

関連する問題