2017-01-16 7 views
1

私はポガーAnalyticsModelを持っています。私はpojoのオブジェクトを作成するループを持っています。オブジェクトを作成するたびに、私はAnalyticsModelListという名前のリストに保存します。そしてループから出た後、私はリストをRDDに変換しています。以下は私のコードです:クラスオブジェクトをJava RDDに変換します

do {  
     AnalyticsModel analyticsObj = new AnalyticsModel(time, columnName, aggrResult); 
     analyticsList.add(analyticsObj); 
    }while (cal.getTimeInMillis() <= endDate); 

    JavaRDD<AnalyticsModel> analyticsRdd = sc.parallelize(analyticsList); 

代わりのリストに追加し、RDDに変換、とにかく私が直接RDDとしてオブジェクトを持つことができますがあります。誰かが私にこのことを教えてもらえますか?私はSparkにはかなり新しいです。

ありがとうございました

+0

そのが、これは良い方法であるだけで、 'KYROのserializer'とジョブは申し訳ありませんが、私 –

答えて

0

方法があります。しかし、AnalyticsModelオブジェクトが少ない(これはあなたが以下の解決策であなたの人生を複雑にする必要はありません)。 AnalyticsModelオブジェクトの膨大な数を作成する場合は、以下の解決策を検討してください。

このクラスは、コールごとに1つのAnalyticsModelインスタンスを生成します。コードの下

public class AnalyticsModelGenerator implements FlatMapFunction<String, AnalyticsModel> { 

    private final Long endDate; 
    private final Calendar cal; 

    public AnalyticsModelGenerator(Calendar cal, Long endDate) { 
     this.cal = cal; 
     this.endDate = endDate; 
    } 
    @Override 
    public Iterable<AnalyticsModel> call(String dummyInput) throws Exception { 
     return new Iterable<AnalyticsModel>() { 
      @Override 
      public Iterator<AnalyticsModel> iterator() { 
       return new AMIterator(cal, endDate); 
      } 
     } 
    } 

    private class AMIterator implements Iterator<AnalyticsModel> { 
     private final Long endDate; 
     private final Calendar cal; 

     public AMIterator(Calendar cal, Long endDate) { 
      this.cal = cal; 
      this.endDate = endDate; 
     } 

     @Override 
     public boolean hasNext() { 
      return (cal.getTimeInMillis() <= endDate); 
     } 

     @Override 
     public AnalyticsModel next() { 
      return new AnalyticsModel(time, columnName, aggrResult); 
     } 
    } 
} 

AnalyticsModelオブジェクトのRDDを作成します。

JavaRDD<String> initJavaRDD = jSparkContext.parallelize(new ArrayList<String>(){{add("dummyInput");}}); 
JavaRDD<AnalyticsModel> amJavaRDD = initJavaRDD.flatMap(new AnalyticsModelGenerator(cal, endDate)); 
+0

はるかに高速になります使用してよさそうです次のコードにかなり従うことができませんでした: JavaRDD initJavaRDD = jSparkContext.parallelize(new ArrayList (){{add( "dummyInput");}})); 私は単純な解決策を考え出しました。これは – Sree

+0

の下に投稿しました。それは、どこでも使用されないダミー文字列で新しいRDDを作成し、必要なだけ多くの'AnalyticsModel'オブジェクトを作成します。 – code

+0

説明をありがとう。このソリューションはうまく見えますが、コール関数がIterableとIteratorを返さないSpark 1.6を使用しているので、残念ながら私のコードでは使用できません。 – Sree

関連する問題