Java 在Spark中使用几个逗号分隔的字段映射RDD

Java 在Spark中使用几个逗号分隔的字段映射RDD,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,我是Spark的新手,我正在学习一个教程,其中使用Scala解析包含多个字段的行,使用Scala的代码如下所示: val pass = lines.map(_.split(",")). map(pass=>(pass(15),pass(7).toInt)). reduceByKey(_+_) 其中pass是从socketTextStream(其SparkStreams)接收的数据。我是Spark的新手,希望使用Java获得相同的结果。我已使用以下方法标记了JavaReceiverInpu

我是Spark的新手,我正在学习一个教程,其中使用Scala解析包含多个字段的行,使用Scala的代码如下所示:

val pass = lines.map(_.split(",")).
map(pass=>(pass(15),pass(7).toInt)).
reduceByKey(_+_)
其中
pass
是从socketTextStream(其SparkStreams)接收的数据。我是Spark的新手,希望使用Java获得相同的结果。我已使用以下方法标记了JavaReceiverInputDStream:

JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);
JavaReceiverInputdStreamLines=jssc.socketTextStream(“localhost”,9999);
我提出了两种可能的解决方案:

  • 使用flatMap:

    JavaDStream words=lines.flatMap(
    新FlatMapFunction(){
    @重写公共Iterable调用(字符串x){
    返回array.asList(x.split(“,”);
    }
    });

  • 但这似乎并不正确,因为结果是将CSV分解为没有任何顺序的单词

  • 使用map(编译错误),这看起来是合适的解决方案,但我无法使用以下方法提取字段15和7:

    JavaDStream words=lines.map(
    新函数(){
    公共列表调用(字符串s){
    返回数组.asList(s.split(“,”);
    }
    });

  • 当我试图映射列表时,这个想法失败了

    映射代码为:

    JavaPairDStream<String, Integer> pairs = words.map(
    new PairFunction<List<String>, String, Integer>() {
      public Tuple2<String, Integer> call(List<String> s) throws Exception {
        return new Tuple2(s.get(15), 6);
      }
    });
    
    JavaPairDStream pairs=words.map(
    新PairFunction(){
    公共元组2调用(列表s)引发异常{
    返回新的Tuple2(s.get(15),6);
    }
    });
    
    错误:

    类中的方法映射

    org.apache.spark.streaming.api.java.AbstractJavaDStreamLike`<T,This,R>` cannot be applied to given types;
    [ERROR] required: org.apache.spark.api.java.function.Function`<java.util.List`<java.lang.String>`,R>`
    [ERROR] found: `<anonymous org.apache.spark.api.java.function.PairFunction`<java.util.List`<java.lang.String>`,java.lang.String,java.lang.Integer>`>`
    [ERROR] reason: no instance(s) of type variable(s) R exist so that argument type `<anonymous org.apache.spark.api.java.function.PairFunction`<java.util.List`<java.lang.String>`,java.lang.String,java.lang.Integer>`>` conforms to formal parameter type org.apache.spark.api.java.
    
    org.apache.spark.streaming.api.java.AbstractJavaDStreamLike``不能应用于给定类型;
    [错误]必需:org.apache.spark.api.java.function.function``
    找到[错误]:``
    [错误]原因:不存在类型变量R的实例,因此参数类型``符合形式参数类型org.apache.spark.api.java。
    

    对此有何建议?

    请使用此代码。它将从字符串中获取require字段

    JavaDStream<String> lines = { ..... };
    JavaPairDStream<String, Integer> pairs = lines.mapToPair(new PairFunction<String, String, Integer>() {
        @Override
        public Tuple2<String, Integer> call(String t) throws Exception {
            String[] words = t.split(",");
            return new Tuple2<String, Integer>(words[15],Integer.parseInt(words[7]));
        }
    });
    
    JavadStreamLines={….};
    JavaPairDStream pairs=lines.mapToPair(新的PairFunction(){
    @凌驾
    公共元组2调用(字符串t)引发异常{
    String[]words=t.split(“,”);
    返回新的Tuple2(单词[15],Integer.parseInt(单词[7]);
    }
    });