JavaRDD<Text> tx= counts2.map(new Function<Object, Text>() {
@Override
public Text call(Object o) throws Exception {
// TODO Auto-generated method stub
if (o.getClass() == Dict.class) {
Dict rkd = (Dict) o;
return new Text(rkd.getId());
} else {
return null ;
}
}
});
tx.saveAsTextFile("/rowkey/Rowkey_new");
我是Spark新手,我想保存此文件,但我得到了 Null异常。我不想使用返回 新文字()来替换 return null ,因为它会在我的文件中插入一个空行。那我怎么解决这个问题呢?
答案 0 :(得分:0)
您只需使用if条件构建RDD filter,而不是在地图中添加if条件。 Spark Quick Start是一个很好的起点。其他transformations和actions也有很好的概述。
基本上,您的代码可以如下所示(如果您使用的是Java 8):
counts2
.filter((o)->o instanceof Dict)
.map(o->new Text(((Dict)o).getId()))
.saveAsTextFile("/rowkey/Rowkey_new");
您打算将一个传入记录映射到零或一个传出记录。使用map
无法做到这一点。但是,filter
映射到零个或一个记录,传入记录与传出记录匹配,flatMap
允许映射到任何类型的零个或多个传出记录,从而为您提供更多灵活性。
奇怪的是,但并非不可思议的是,您创建的非Dict
对象无论如何都将被进一步向下游过滤。可能您可以考虑将filter
推向更上游,以确保只创建Dict
个实例。在不知道其余代码的情况下,这只是一个假设,无论如何都不是原始问题的一部分。