使用java

时间:2017-01-26 05:43:57

标签: java apache-spark

我是新来的火花,我做了一些简单的代码,但我在完成任务时遇到了问题。我正在使用Java 1.7 SE和Spark 2.0.1来完成一些任务。

以下是我的代码。

JavaRDD<String> newLine = line.flatMap(new FlatMapFunction<String, String>() {
    public List<String> call(String s) throws Exception {
        List<String> ret = new ArrayList<String>();
        List<String> ls = Arrays.asList(s.split("\t"));

        String values = ls.get(ls.size()-1);
        List<String> value = Arrays.asList(values.split("\\|"));

        for(int i=0;i<value.size();++i){
            String ns = ls.get(0)+"\t"+ls.get(1)+"\t"+ls.get(2)+"\t"+ls.get(3)+"\t"+ls.get(4)+"\t"+ls.get(5);
            ns = ns + "\t" + value.get(i);
            ret.add(ns);
        }
        return ret;
    }
});

public List<String> call(String s) throws ExceptionList<String>而发生错误。错误消息显示我尝试使用不兼容的返回类型。我理解这个消息,但我找不到合适的解决方案。另外,当我使用maven repo从1.6.0更改spark库2.0.1时,就发生了这个错误。 如果您能就如何解决此问题向我提供指导,我将不胜感激。

为方便起见,我附上了整个代码,如下所示。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;

public class DataTrans {
    public static void main(String[] args) throws Exception{
        String inputFile = args[0];
        String outputFile = args[1];

        SparkConf conf = new SparkConf().setAppName("Data Transformation")
                .set("spark.serializer","org.apache.spark.serializer.KryoSerializer").setMaster("local[*]");

        JavaSparkContext sc = new JavaSparkContext(conf);

        /* Load our input data. */
        JavaRDD<String> input = sc.textFile(inputFile);

        JavaRDD<String> line = input.flatMap(new FlatMapFunction<String, String>() {
            public Iterator<String> call(String s) throws Exception {
                return Arrays.asList(s.split("\n")).iterator();
            }
        });

        JavaRDD<String> newLine = line.flatMap(new FlatMapFunction<String, String>() {
            public List<String> call(String s) throws Exception {
                List<String> ret = new ArrayList<String>();
                List<String> ls = Arrays.asList(s.split("\t"));

                String values = ls.get(ls.size()-1);
                List<String> value = Arrays.asList(values.split("\\|"));

                for(int i=0;i<value.size();++i){
                    String ns = ls.get(0)+"\t"+ls.get(1)+"\t"+ls.get(2)+"\t"+ls.get(3)+"\t"+ls.get(4)+"\t"+ls.get(5);
                    ns = ns + "\t" + value.get(i);
                    ret.add(ns);
                }
                return ret;
            }
        });
        newLine.saveAsTextFile(outputFile);

        sc.stop();
        sc.close();
    }
} 

由于

1 个答案:

答案 0 :(得分:2)

它应该在call()返回类型

中返回Iterator<String>而不是List<String>
   JavaRDD<String> newLine = line.flatMap(new FlatMapFunction<String, String>() {
        public Iterator<String> call(String s) throws Exception {
            List<String> ret = new ArrayList<String>();
            List<String> ls = Arrays.asList(s.split("\t"));

            String values = ls.get(ls.size()-1);
            List<String> value = Arrays.asList(values.split("\\|"));

            for(int i=0;i<value.size();++i){
                String ns = ls.get(0)+"\t"+ls.get(1)+"\t"+ls.get(2)+"\t"+ls.get(3)+"\t"+ls.get(4)+"\t"+ls.get(5);
                ns = ns + "\t" + value.get(i);
                ret.add(ns);
            }
            return ret.iterator();
        }
    });