我有一个RDD(combinerRDD),我在其下面应用了转换
JavaPairRDD<String, Integer> counts = combinerRDD.mapToPair(
new PairFunction<Tuple2<LongWritable, Text>, String, Integer>() {
String filename;
Integer count;
Message message;
@Override
public Tuple2<String, Integer> call(Tuple2<LongWritable, Text> tuple) throws Exception {
xlhrCount = 0;
filename = "";
filename = "New_File";
for (JobStep js : message.getJobStep()) {
if (js.getStepName().equals(StepName.NEW_STEP)) {
count += 1;
}
}
return new Tuple2<String, Integer>(filename, xlhrCount);
}
}).reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer count1, Integer count2) throws Exception {
return (count1 + count2);
}
}
);
我的问题是当combinerRDD
内部有一些数据时,我得到了正确的结果。但是当combinerRDD
为空时,写入HDFS的结果只是一个空的_SUCCESS文件。我想在一个空的RDD转换的情况下有2个文件,即_SUCCESS和空的part-00000文件。我对吗?我应该得到多少输出文件。
我之所以要问这是因为我在2个集群中获得了不同的结果,在集群1上运行的代码导致_SUCCESS文件,集群2导致_SUCCESS并且空部分00000。我现在很困惑。结果是否依赖于任何群集设置?
注意:我在newRDD.leftOuterJoin(combinerRDD)
上进行左连接,这没有给出任何结果(当combinerRDD只有_SUCCESS时),newRDD包含值。
答案 0 :(得分:0)
好的,所以我找到了解决方案。我正在使用spark-1.3.0,它有以下问题:即。带有空RDD的左外连接给出空结果。
https://issues.apache.org/jira/browse/SPARK-9236
我正在创建如下所示的空对RDD:
JavaRDD<Tuple2<LongWritable, Text>> emptyRDD = context.emptyRDD();
myRDD = JavaPairRDD.fromJavaRDD(emptyRDD);
现在使用:
List<Tuple2<LongWritable, Text>> data = Arrays.asList();
JavaRDD<Tuple2<LongWritable, Text>> emptyRDD = context.parallelize(data);
myRDD = JavaPairRDD.fromJavaRDD(emptyRDD);
它现在有效,即我的RDD不再是空的。修复版本可用: 1.3.2,1.4.2,1.5.0(参考上面的链接)。