我是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);
我提出了两种可能的解决方案:
使用flatMap:
JavaDStream<String> words = lines.flatMap(
new FlatMapFunction<String, String>() {
@Override public Iterable<String> call(String x) {
return Arrays.asList(x.split(","));
}
});
但它看起来并不正确,因为结果是将CSV分解为没有任何顺序的单词。
使用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(","));
}
});
当我尝试映射列表<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.
对此有何建议?
答案 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]));
}
});