我有一组看起来像这样的数据:
<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)))
我更喜欢并行化的方法。
答案 0 :(得分:1)
你不一定需要笛卡儿。让我们假设天数是连续的(即你总是通过计算单一路径来知道前一天是什么。如果不是这种情况,你可以将它们编入索引以找到先前的索引。)
您现在可以在日期和collect_list上执行groupby以获取ID。然后使用date_sub将一天减去一个新列。
现在在两者之间进行连接,这样你就可以在每个日期和前一个日期之间进行连接,并使用UDF来计算差异。
如果在groupby之后您的数据足够小,您可以尝试使用只有orderBy(没有partitionBy)的窗口并使用滞后函数