2015-11-02 10 views
14

zu leeren habe ich eine RDDeine RDD initialisieren

genannt
JavaPairRDD<String, List<String>> existingRDD; 

Jetzt muss ich existingRDD diese initialisieren zu leeren, so dass, wenn ich die tatsächlichen rdd die bekomme ich mit diesem existingRDD eine Vereinigung tun können. Wie initialisiere ich existingRDD auf eine leere RDD mit Ausnahme der Initialisierung auf Null? Hier ist mein Code:

JavaPairRDD<String, List<String>> existingRDD; 
if(ai.get()%10==0) 
{ 
    existingRDD.saveAsNewAPIHadoopFile("s3://manthan-impala-test/kinesis-dump/" + startTime + "/" + k + "/" + System.currentTimeMillis() + "/", 
    NullWritable.class, Text.class, TextOutputFormat.class); //on worker failure this will get overwritten         
} 
else 
{ 
    existingRDD.union(rdd); 
} 
+0

Ich bin mir nicht sicher, ich verstehe ganz, was Sie versuchen zu tun. Sie möchten eine Union auf einer leeren RDD erstellen? Wozu? – eliasah

+0

Ja. Wenn ich durch jedes RDDD falle ich foreachRDD in meinem Code meine ich muss Vereinigung von RDDs zu diesem existingRDD tun, damit ich dieses vorhandene RDD zu meinem s3 speichern kann –

+0

Warum können Sie nicht einfach das 'existingRDD' auf 'rdd' in den stellen erste Iteration nach dem Schreiben auf s3? –

Antwort

21

Ich bin immer noch nicht sicher, was Sie versuchen zu tun, aber Sie können einen leeren RDD erstellen, wie folgt:

// Get an RDD that has no partitions or elements. 
JavaRDD<T> emptyRDD = sc.emptyRDD() 

Ich hoffe, Sie wissen, wie man Verwendung Generika, sonst, hier ist es:

JavaRDD<Tuple2<String,List<String>>> emptyRDD = sc.emptyRDD(); 
JavaPairRDD<String,List<String>> emptyPairRDD = JavaPairRDD.fromJavaRDD(
    existingRDD 
); 

Sie auch die mapToPair Methode können Sie Ihre JavaRDD auf einkonvertieren.

Die Lösung in scala:

scala> val emptyRDD = sc.emptyRDD 
// emptyRDD: org.apache.spark.rdd.EmptyRDD[Nothing] = EmptyRDD[1] at ... 
0

In scala, habe ich Befehl "parallelisieren".

val emptyRDD = sc.parallelize(Seq("")) 
+1

Ich bin mir ziemlich sicher, dass das eine 'RDD [String]' mit einem Eintrag erzeugt, der leere String. –

0

@eliasah Antwort ist sehr nützlich, ich stelle Code zur Verfügung, um leere Paar RDD zu erstellen. Stellen Sie sich ein Szenario vor, in dem RDD (Schlüssel, Wert) eines leeren Paares erstellt werden muss. Der folgende scala-Code zeigt, wie RDDs für leere Paare mit Schlüssel als String und Wert als Int erstellt werden.

type pairRDD = (String,Int) 
var resultRDD = sparkContext.emptyRDD[pairRDD] 

würde RDD wie folgt erstellt werden:

resultRDD: org.apache.spark.rdd.EmptyRDD[(String, Int)] = EmptyRDD[0] at emptyRDD at <console>:29 
0

In Java erstellen die leere RDD ein wenig komplex war. Ich habe versucht, die scala.reflect.classTag zu verwenden, aber es funktioniert auch nicht. Nach vielen Tests war der Code, der funktionierte, noch einfacher.

private JavaRDD<Foo> getEmptyJavaRdd() { 

/* this code does not compile because require <T> as parameter into emptyRDD */ 
//  JavaRDD<Foo> emptyRDD = sparkContext.emptyRDD(); 
//  return emptyRDD; 

/* this should be the solution that try to emulate the scala <T> */ 
/* but i could not make it work too */ 
//  ClassTag<Foo> tag = scala.reflect.ClassTag$.MODULE$.apply(Foo.class); 
//  return sparkContext.emptyRDD(tag); 

/* this alternative worked into java 8 */ 
    return SparkContext.parallelize(
      java.util.Arrays.asList() 
    ); 

} 
Verwandte Themen