(还在学习spark的初级阶段,将书上scala实现的例子用java写出来)
已知一个数组,数组中只有一个数据是出现一次的,其他数据是出现两次的,将出现一次的数据找出。
其中要处理的数字都放在一个文件里面,以空格分隔。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
public class NumOnce
{
public static void main(String[] args)
{
SparkConf conf=new SparkConf().setAppName("topK")
.setMaster("spark://master:7077")
.setJars(new String[]{"hdfs://master:9000/user/hadoop/NumOnce.jar"});
JavaSparkContext jsc=new JavaSparkContext(conf);
int data=
//读取数据
jsc.textFile("hdfs://master:9000/user/hadoop/data")
//数字按照" "分隔,提取出数字。
.flatMap(new FlatMapFunction<String,String>()
{
@Override
public Iterable<String> call(String t)
throws Exception
{
// TODO Auto-generated method stub
return Arrays.asList(t.split(" "));
}
})
//数据读进来时默认是String类型,为了进行异或操作将其转换成int
.map(x->Integer.parseInt(x))
//将各分区分别异或
.mapPartitions(new FlatMapFunction<Iterator<Integer>,Integer>()
{
@Override
public Iterable<Integer> call(Iterator<Integer> t)
throws Exception
{
// TODO Auto-generated method stub
int temp=t.next();
while(t.hasNext())
{
temp^=t.next();
}
ArrayList<Integer> kk=new ArrayList<Integer>();
kk.add(temp);
return kk;
}
}
)
//将各个分区异或的结果进行异或
.reduce((a,b)->a^b);
System.out.println(data);
jsc.close();
}
}