我有张桌子看起来像
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="a",聚合的输出值应该是
output = root(1 + 2 + 5, 3) + root(4 + 3 + 9, 3)
后一个3是因为我们有3条关于a的记录。对于ID='b',它是:
output = root(6 + 4 + 9 + 2, 4) + root(2 + 2 + 1 + 5, 4)
这种组合是非线性的。因此,为了获得正确的结果,所有具有相同"ID“的数据必须位于一个执行器中。
我在Spark2.0中检查了UDF或聚合器。根据我的理解,它们都是“线性组合”。
有办法处理这种非线性组合计算吗?特别是利用星火并行计算的优势?
发布于 2017-02-19 23:39:47
您使用的函数不需要任何特殊处理。您可以在join
中使用普通SQL。
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.{count, lit, sum, pow}
def root(l: Column, r: Column) = pow(l, lit(1) / r)
val out = root(sum($"value1"), count("*")) + root(sum($"value2"), count("*"))
df.groupBy("id").agg(out.alias("outcome")).join(df, Seq("id"))
或窗口功能:
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy("id")
val outw = root(sum($"value1").over(w), count("*").over(w)) +
root(sum($"value2").over(w), count("*").over(w))
df.withColumn("outcome", outw)
https://stackoverflow.com/questions/42334039
复制相似问题