我是Spark的新手有关于计算持续时间的问题。我有一个服务器日志,其中包含IP地址和服务器连接时间(日期时间字段)。我试图计算日志中每条记录的连接时间之间的持续时间。我能够过滤掉设置并格式化我需要的所有数据,但我不知道如何比较给定IP地址的两个不同行之间的值。
以下是我的设置。
IP Activity
235.325.23.22, 2014-09-01 03:31
235.325.23.22, 2014-09-01 03:39
235.325.23.22, 2014-09-01 03:43
235.325.23.22, 2014-09-01 03:46
235.325.23.22, 2014-09-01 03:55
235.423.25.44, 2014-09-01 17:21
235.423.25.44, 2014-09-01 17:30
235.423.25.44, 2014-09-01 17:34
235.423.25.44, 2014-09-01 17:42
235.423.25.44, 2014-09-01 17:51
我想得到以下结果:
235.325.23.22, 2014-09-01 03:31am,0 base--start of the 235.325.23.22 IP set
235.325.23.22, 2014-09-01 03:39am,8 minutes
235.325.23.22, 2014-09-01 03:43am,4 minutes
235.325.23.22, 2014-09-01 03:46am,3 minutes
235.325.23.22, 2014-09-01 03:55am,9 minutes
235.423.25.44, 2014-09-01 17:21pm,0 base-- start of the new 235.423.25.44 IP set
235.423.25.44, 2014-09-01 17:30pm,9 minutes
235.423.25.44, 2014-09-01 17:34pm,4 minutes
235.423.25.44, 2014-09-01 17:42pm,8 minutes
235.423.25.44, 2014-09-01 17:51pm,9 minutes
非常感谢任何帮助。
答案 0 :(得分:1)
这不是一个完整的答案,而是方向:
让我们调用你的初始设置rdd,这样它就是一个用IP键入的rdd,其日期时间字符串为值。
使用val sortedRDD = rdd.repartitionAndSortWithinPartitions(new HashPartitioner(numPartitions))为每个键创建一个排序分区(选择numPartitions比键大得多)。 然后在sortedRDD上使用mapPartitions - 你将获得一个已排序的迭代器,所以你只需要跟踪前一个值并随时减去。 在一个非常懒惰的尝试像
sortedRDD.mapPartitions(iter=>{ var prev=""; iter.map{i=>val t =(i._1,i._2,if (prev=="") 0 else prev);prev=i._2;t}})
(我没有做差异,也没有解析日期,但希望这可以帮助你理解这个想法)