按键对列表进行分组,并识别组之间的新元素和过期元素

时间:2017-01-26 10:06:23

标签: scala apache-spark

我有一组看起来像这样的数据:

<date>,<id>
24-01-2017,1
24-01-2017,2
24-01-2017,3
25-01-2017,1
25-01-2017,4
26-01-2017,1

我希望按日期对数据进行分组,并计算每个日期中出现的新ID的数量,以及之前已删除的ID的数量。

因此,对于该示例,我期望输出看起来像:

<date>,<new_IDs>,<removed_IDs>
24-01-2017,0,0
25-01-2017,1,2
26-01-2017,0,1

我试图在Spark中有效地做到这一点,并且想不出一个简单的方法(好吧,我想到了笛卡尔,但它看起来真的很傻)。感谢任何帮助。谢谢。

========== EDIT ======

我现在可以通过收集大师的一切来做到这一点:

即:

val part1 = data.groupByKey.collect.sortBy(_._1).dropRight(1)
val part2 = data.groupByKey.collect.sortBy(_._1).drop(1)
val result = (part1,part2).zipped.map((x,y)=>(y._1,((x._2 diff y._2).size , (y._2 diff x._2).size)))

我更喜欢并行化的方法。

1 个答案:

答案 0 :(得分:1)

你不一定需要笛卡儿。让我们假设天数是连续的(即你总是通过计算单一路径来知道前一天是什么。如果不是这种情况,你可以将它们编入索引以找到先前的索引。)

您现在可以在日期和collect_list上执行groupby以获取ID。然后使用date_sub将一天减去一个新列。

现在在两者之间进行连接,这样你就可以在每个日期和前一个日期之间进行连接,并使用UDF来计算差异。

如果在groupby之后您的数据足够小,您可以尝试使用只有orderBy(没有partitionBy)的窗口并使用滞后函数