如何在SPARK中使用Java的map-function

pro*_*bie 7 java csv apache-spark

我尝试在spark中读取一个csv文件,我想分割以逗号分隔的行,以便我有一个带有二维数组的RDD.我对Spark很新.

我试着这样做:

public class SimpleApp 
{   
    public static void main(String[] args) throws Exception 
    {       
        String master = "local[2]";
        String csvInput = "/home/userName/Downloads/countrylist.csv";
        String csvOutput = "/home/userName/Downloads/countrylist";

        JavaSparkContext sc = new JavaSparkContext(master, "loadwholecsv", System.getenv("SPARK_HOME"), System.getenv("JARS"));

        JavaRDD<String> csvData = sc.textFile(csvInput, 1);
        JavaRDD<String> words = csvData.map(new Function <List<String>>() { //line 43
              @Override
              public List<String> call(String s) {
                return Arrays.asList(s.split("\\s*,\\s*"));
              }
            });

        words.saveAsTextFile(csvOutput);
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该拆分行并返回一个ArrayList.但我不确定这一点.我收到此错误:

SimpleApp.java:[43,58] wrong number of type arguments; required 2
Run Code Online (Sandbox Code Playgroud)

Hol*_*den 8

所以该计划有两个小问题.首先,你可能想要flatMap而不是map,因为你试图返回单词的RDD而不是单词列表的RDD,我们可以使用flatMap来平坦化结果.另一个是,我们的函数类还需要调用它的输入类型.我将替换JavaRDD单词...:

JavaRDD<String> words = rdd.flatMap(
  new FlatMapFunction<String, String>() { public Iterable<String> call(String s) {
      return Arrays.asList(s.split("\\s*,\\s*"));
    }});
Run Code Online (Sandbox Code Playgroud)