首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在星火中使用GroupByKey计算非线性群任务

如何在星火中使用GroupByKey计算非线性群任务
EN

Stack Overflow用户
提问于 2017-02-19 23:09:55
回答 1查看 259关注 0票数 1

我有张桌子看起来像

代码语言:javascript
运行
复制
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

以下是任务和要求:

  1. 我想将列ID设置为键,而不是列时间,但我不想删除列时间。星火中有设置主键的方法吗?
  2. 聚合函数是非线性的,这意味着您不能使用"reduceByKey“。在计算之前,所有的数据必须被洗牌到一个节点上。例如,聚合函数可能看起来像求和值的根N,其中N是每个ID的记录数(计数): 输出=根(sum(Value1),count(*)) + root(sum(value2),count(*))

为了说明清楚,对于ID="a",聚合的输出值应该是

代码语言:javascript
运行
复制
 output = root(1 + 2 + 5, 3) + root(4 + 3 + 9, 3)    

后一个3是因为我们有3条关于a的记录。对于ID='b',它是:

代码语言:javascript
运行
复制
 output = root(6 + 4 + 9 + 2, 4) + root(2 + 2 + 1 + 5, 4) 

这种组合是非线性的。因此,为了获得正确的结果,所有具有相同"ID“的数据必须位于一个执行器中。

我在Spark2.0中检查了UDF或聚合器。根据我的理解,它们都是“线性组合”。

有办法处理这种非线性组合计算吗?特别是利用星火并行计算的优势?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-19 23:39:47

您使用的函数不需要任何特殊处理。您可以在join中使用普通SQL。

代码语言:javascript
运行
复制
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"))

或窗口功能:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42334039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档