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

时间:2015-12-09 12:15:47

标签: 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来获得相同的结果。我已使用以下内容声明JavaReceiverInputDStream

JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);

我提出了两种可能的解决方案:

  1. 使用flatMap:

    JavaDStream<String> words = lines.flatMap( new FlatMapFunction<String, String>() { @Override public Iterable<String> call(String x) { return Arrays.asList(x.split(",")); } });

  2. 但它看起来并不正确,因为结果是将CSV分解为没有任何顺序的单词。

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

      JavaDStream<List<String>> words = lines.map( new Function<String, List<String>>() { public List<String> call(String s) { return Arrays.asList(s.split(",")); } });

    2. 当我尝试映射列表<String> =&gt;时,这个想法失败了Tuple2 <String, Int>

      映射代码为:

      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);
        }
      });
      

      错误:

      中的方法图
      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.
      

      对此有何建议?

1 个答案:

答案 0 :(得分:0)

使用此代码。它将从String获取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]));
    }
});