在Spark中评估和组合连续记录

时间:2015-03-23 15:32:19

标签: scala apache-spark rdd contiguous

由于我是Spark / Scala的新手,我处理我的第一个问题,并且我想知道是否有一种简单的方法可以使用Spark本机操作来处理它们scala方法,因为我可能会遗漏一些东西。

假设我有一个文本文件日志(先前已订购),每行代表人次

Peter|5:45 Peter|6:05 Peter|6:27 Peter|6:58 Peter|6:59 Peter|7:59 Mark|7:40 Mark|7:55 Mark|8:30

现在我可以创建一个存储人和时间的RDD:

val file = sc.textFile(logFile, 2).cache()
val log = file.map(x => (x.split('|').lift(0).get,x.split('|').lift(1).get))

我想要的是一个新值(间隔),表示如果差异小于30分钟,连续记录(对于同一个人)属于相同的时间间隔。

在下表中,您可以看到:

  • 记录#1和#2相差20分钟,因此它们处于相同的间隔
  • 记录#2和#3相差22分钟,因此它们处于相同的间隔
  • 记录#3和#4相差31分钟,因此它们不在相同的时间间隔内(第一个时间间隔为#1#2#3,下一个时间间隔的第一个记录为#4)



#   Person   Time   "Lag"     Diff      Note                   Interval
1   Peter    5:45   -         -         first row Peter        Peter started at 5:45
2   Peter    6:05   5:45      20        <30 mins               Peter started at 5:45
3   Peter    6:27   6:05      22        <30 mins               Peter started at 5:45
4   Peter    6:58   6:27      31        >30 mins               Peter started at 6:58
5   Peter    6:59   6:58      1         <30 mins               Peter started at 6:58
6   Peter    7:59   6:59      60        >30 mins               Peter started at 7:59
7   Mark     7:40   -         -         first row Mark         Mark started at 7:40
8   Mark     7:55   7:40      15        <30 mins               Mark started at 7:40
9   Mark     8:30   7:55      35        >30 mins               Mark started at 8:30
&#13;
&#13;
&#13;

所以我的RDD应该是这样的:

&#13;
&#13;
 Person   Time   Interval
 Peter    5:45   Peter@5:45
 Peter    6:05   Peter@5:45
 Peter    6:27   Peter@5:45
 Peter    6:58   Peter@6:58
 Peter    6:59   Peter@6:58
 Peter    7:59   Peter@7:59
 Mark     7:40   Mark@7:40
 Mark     7:55   Mark@7:40
 Mark     8:30   Mark@8:30
&#13;
&#13;
&#13;

这是否可以通过合理的努力,或者我是否假装过多的Spark本机操作与Scala方法相结合?

由于我更熟悉SQL,因此使用Spark-SQL来操作我的数据集可能会更容易,但我也想熟悉Spark核心。

每个建议,提示,代码示例都将非常感激。

提前致谢

FF

0 个答案:

没有答案