1
您好我有一个表,看起来像如何使用GroupByKey在星火计算非线性GROUPBY任务
Time ID Value1 Value2
1 a 1 4
2 a 2 3
3 a 5 9
1 b 6 2
2 b 4 2
3 b 9 1
4 b 2 5
1 c 4 7
2 c 2 0
这里的任务和要求:
我要设置列ID作为关键,不是列时间,但我不想删除列时间。 Spark中有没有设置主键的方法?
聚合函数是非线性的,这意味着你不能使用“reduceByKey”。在计算之前,所有数据都必须混合到一个节点。例如,聚合函数可能看起来像总数值的根N,其中N是每个ID的记录数(计数):
output = root(sum(value1),count())+ root (总和(值2),计数())
要清楚,对于ID = “A”,聚集的输出值应该是
output = root(1 + 2 + 5, 3) + root(4 + 3 + 9, 3)
后3是因为我们3记录一个。对于ID ='b',它是:
output = root(6 + 4 + 9 + 2, 4) + root(2 + 2 + 1 + 5, 4)
该组合是非线性的。因此,为了获得正确的结果,具有相同“ID”的所有数据必须在一个执行器中。
我在Spark 2.0中选中了UDF或Aggregator。根据我的理解,他们都假设为“线性组合”
有没有办法处理这种非线性组合计算?特别是,利用Spark的并行计算的优势?
你可以做一个reduceByKey,产生的总和,和该值的计数,然后执行根(Σ, [count])就可以了,不是吗? –