在Java Spark中合并来自元组两个值的数据
我有一个包含以下数据的文件: 1231212名称1名称2 1431344姓名1姓名3 2342343姓名3姓名4 2344255名称2名称1 我想让我的Java程序在Spark中执行一些操作,这样我的输出如下:在Java Spark中合并来自元组两个值的数据,java,apache-spark,Java,Apache Spark,我有一个包含以下数据的文件: 1231212名称1名称2 1431344姓名1姓名3 2342343姓名3姓名4 2344255名称2名称1 我想让我的Java程序在Spark中执行一些操作,这样我的输出如下: List<Tuple2<String,Long>> result1 = accessLogs.map(log -> new Tuple2<Long, String>(log.getTimestamp(), log
List<Tuple2<String,Long>> result1 =
accessLogs.map(log -> new Tuple2<Long, String>(log.getTimestamp(), log.getHostname1()))
.filter(tuple -> tuple._1() > init_time - 5)
.filter(tuple -> tuple._1() < fin_time + 5)
.map(e -> (new Tuple2<String, Long>(e._2, 1L)))
.take(100);
List<Tuple2<String, Long>> result2 =
accessLogs.map(log -> new Tuple2<Long, String>(log.getTimestamp(), log.getHostname2()))
.filter(tuple -> tuple._1() > init_time - 5)
.filter(tuple -> tuple._1() < fin_time + 5)
.map(e -> (new Tuple2<String, Long>(e._2, 1L)))
.take(100);
[(姓名1,3)、(姓名2,2)、(姓名3,2)、(姓名4,1)]
但我仍然不知道如何使用平面和减少操作。我刚开始学火花
我现在的情况如下:
List<Tuple2<String,Long>> result1 =
accessLogs.map(log -> new Tuple2<Long, String>(log.getTimestamp(), log.getHostname1()))
.filter(tuple -> tuple._1() > init_time - 5)
.filter(tuple -> tuple._1() < fin_time + 5)
.map(e -> (new Tuple2<String, Long>(e._2, 1L)))
.take(100);
List<Tuple2<String, Long>> result2 =
accessLogs.map(log -> new Tuple2<Long, String>(log.getTimestamp(), log.getHostname2()))
.filter(tuple -> tuple._1() > init_time - 5)
.filter(tuple -> tuple._1() < fin_time + 5)
.map(e -> (new Tuple2<String, Long>(e._2, 1L)))
.take(100);
列表结果1=
accessLogs.map(log->new Tuple2(log.getTimestamp(),log.getHostname1())
.filter(tuple->tuple.\u 1()>init\u time-5)
.filter(tuple->tuple.\u 1()(新的Tuple2(e.2,1L)))
.取(100);
列表结果2=
accessLogs.map(log->new Tuple2(log.getTimestamp(),log.getHostname2())
.filter(tuple->tuple.\u 1()>init\u time-5)
.filter(tuple->tuple.\u 1()(新的Tuple2(e.2,1L)))
.取(100);
因此,我的结果是两个不同的列表,其中包含以下数据:
[(名称1,1)、(名称1,1)、(名称3,1)、(名称2,1)]
[(名称2,1)、(名称3,1)、(名称4,1)、(名称1,1)]
通过使用一个列表,我可以使用什么来实现想要的结果
我的想法是这样开始:
List<String> finalResult =
accessLogs.map(log -> new Tuple3<Long, String, String>(log.getTimestamp(), log.getHostname1(), log.getHostname2()))
.filter(tuple -> tuple._1() > init_time - 5)
.filter(tuple -> tuple._1() < fin_time + 5)...
列出最终结果=
accessLogs.map(log->new Tuple3(log.getTimestamp(),log.getHostname1(),log.getHostname2())
.filter(tuple->tuple.\u 1()>init\u time-5)
.filter(元组->元组1()
然后继续执行操作
编辑:
现在我有以下代码:
JavaPairRDD<String, Integer> pairs1 = accessLogs.mapToPair(new PairFunction<LogObject, String, Integer>() {
public Tuple2<String, Integer> call(LogObject s) { return new Tuple2<String, Integer>(s.getHostname1(), 1); }
}).reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer a, Integer b) { return a + b; }
});
javapairdd pairs1=accessLogs.mapToPair(新PairFunction(){
公共Tuple2调用(logobjects){返回新的Tuple2(s.getHostname1(),1);}
}).reduceByKey(新功能2(){
公共整数调用(整数a,整数b){返回a+b;}
});
返回
[(名称1,2)、(名称3,1)、(名称2,1)]
但是我仍然缺少关于如何执行此操作的部分(来自建议的答案)
.flatMap{case(u,key1,key2)=>List((key1,1),(key2,1))}
在Java中,我可以从第二列和第三列检索数据。有很多方法可以做到这一点,但一种方法是使用
flatMap
,然后使用reduceByKey
。我的Java技能有点生疏,因此我将在Scala中列出它-希望您理解这一点,然后可以自己将其转换为Java:)
有很多方法可以做到这一点,但其中一种方法是使用
flatMap
,然后使用reduceByKey
。我的Java技能有点生疏,因此我将在Scala中列出它-希望您理解这一点,然后可以自己将其转换为Java:)
遗憾的是,在Java中要长得多,但我可以使用flatMap和reduceByKey来完成。谢谢遗憾的是,在Java中要长得多,但我可以使用flatMap和reduceByKey来完成。谢谢