在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

我有一个包含以下数据的文件:

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.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来完成。谢谢