我有一个名为
的RDDJavaPairRDD<String, List<String>> existingRDD;
现在我需要将此existingRDD
初始化为空,以便当我得到实际的rdd时,我可以使用此existingRDD
进行联合。
除了将其初始化为null之外,如何将existingRDD
初始化为空RDD?
这是我的代码:
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 :(得分:25)
要在 Java 中创建一个空的RDD,您只需执行以下操作:
// Get an RDD that has no partitions or elements.
JavaSparkContext jsc;
...
JavaRDD<T> emptyRDD = jsc.emptyRDD();
我相信您知道如何使用泛型,否则,对于您的情况,您需要:
JavaRDD<Tuple2<String,List<String>>> emptyRDD = jsc.emptyRDD();
JavaPairRDD<String,List<String>> emptyPairRDD = JavaPairRDD.fromJavaRDD(
existingRDD
);
您还可以使用mapToPair
方法将JavaRDD
转换为JavaPairRDD
。
在 Scala :
val sc: SparkContext = ???
...
val emptyRDD = sc.emptyRDD
// emptyRDD: org.apache.spark.rdd.EmptyRDD[Nothing] = EmptyRDD[1] at ...
答案 1 :(得分:2)
val emptyRdd=sc.emptyRDD[String]
上述语句将使用String
类型
来自SparkContext类:
获取没有分区或元素的RDD
def emptyRDD[T: ClassTag]: EmptyRDD[T] = new EmptyRDD[T] (this)
答案 2 :(得分:0)
在scala中,我使用&#34; parallelize&#34;命令。
val emptyRDD = sc.parallelize(Seq(""))
答案 3 :(得分:0)
@eliasah回答非常有用,我提供代码来创建空对RDD。考虑一种需要创建空对RDD(键,值)的场景。以下scala代码说明了如何创建空对RDD,其中键为String,值为Int。
type pairRDD = (String,Int)
var resultRDD = sparkContext.emptyRDD[pairRDD]
RDD将按如下方式创建:
resultRDD: org.apache.spark.rdd.EmptyRDD[(String, Int)] = EmptyRDD[0] at emptyRDD at <console>:29
答案 4 :(得分:0)
在Java中,创建空RDD有点复杂。我尝试使用scala.reflect.classTag,但它也不起作用。经过多次测试,有效的代码更加简单。
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()
);
}
答案 5 :(得分:0)
在Java中,如下创建空对RDD:
JavaPairRDD<T, T> emptyPairRDD = JavaPairRDD.fromJavaRDD(SparkContext.emptyRDD());