J'ai un RDD appelé
JavaPairRDD<String, List<String>> existingRDD;
Maintenant, j'ai besoin d'initialiser ceci existingRDD
à vider pour pouvoir créer une union avec ce existingRDD
..__ lorsque j'obtiens les RDD réels. Comment initialiser existingRDD
à un RDD vide sauf en l'initialisant à null? Voici mon 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);
}
Pour créer un RDD vide dans Java , procédez comme suit:
// Get an RDD that has no partitions or elements.
JavaSparkContext jsc;
...
JavaRDD<T> emptyRDD = jsc.emptyRDD();
J'espère que vous savez utiliser les génériques, sinon, vous aurez besoin de:
JavaRDD<Tuple2<String,List<String>>> emptyRDD = jsc.emptyRDD();
JavaPairRDD<String,List<String>> emptyPairRDD = JavaPairRDD.fromJavaRDD(
existingRDD
);
Vous pouvez également utiliser la méthode mapToPair
pour convertir votre JavaRDD
en JavaPairRDD
.
Dans Scala :
val sc: SparkContext = ???
...
val emptyRDD = sc.emptyRDD
// emptyRDD: org.Apache.spark.rdd.EmptyRDD[Nothing] = EmptyRDD[1] at ...
val emptyRdd=sc.emptyRDD[String]
L'instruction ci-dessus créera un RDD vide avec String
Type
De la classe SparkContext:
Obtenez un RDD sans partition ni élément
def emptyRDD[T: ClassTag]: EmptyRDD[T] = new EmptyRDD[T] (this)
En scala, j'ai utilisé la commande "paralléliser".
val emptyRDD = sc.parallelize(Seq(""))
En Java, créez une paire RDD vide comme suit:
JavaPairRDD<T, T> emptyPairRDD = JavaPairRDD.fromJavaRDD(SparkContext.emptyRDD());
@eliasah answer est très utile, je fournis du code pour créer une paire vide RDD. Prenons un scénario dans lequel il est nécessaire de créer une paire vide RDD (clé, valeur). Le code scala suivant montre comment créer une paire vide RDD avec key as String et value as Int.
type pairRDD = (String,Int)
var resultRDD = sparkContext.emptyRDD[pairRDD]
RDD serait créé comme suit:
resultRDD: org.Apache.spark.rdd.EmptyRDD[(String, Int)] = EmptyRDD[0] at emptyRDD at <console>:29
En Java, créer le RDD vide était un peu complexe. J'ai essayé d'utiliser scala.reflect.classTag mais cela ne fonctionne pas non plus. Après de nombreux tests, le code qui fonctionnait était encore plus simple.
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()
);
}