gpt4 book ai didi

java - 如何在循环中生成Spark数据集聚合长expers?

转载 作者:行者123 更新时间:2023-12-02 10:07:32 25 4
gpt4 key购买 nike

我正在使用 Java Spark 来统计数据集。

我需要聚合许多专家的数据集,因此代码又长又难看。这些expers有一些共同的逻辑,我可以用循环生成expers吗?这是代码示例,实际代码有数百行重复代码:

Dataset<Row> res = ds.groupBy(ds.col("uid")).agg(functions.max(ds.col("create_time")).as("create_time"),functions.sum(functions.when(ds.col("date_diff").$less$eq(30).and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_1"),
functions.sum(functions.when(ds.col("date_diff").$less$eq(60)
.and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_2"),
functions.sum(functions.when(ds.col("date_diff").$less$eq(90)
.and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_3"),
functions.sum(functions.when(ds.col("date_diff").$less$eq(120)
.and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_4"),
functions.sum(functions.when(ds.col("date_diff").$less$eq(150)
.and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_5"),
functions.sum(functions.when(ds.col("date_diff").$less$eq(180)
.and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_6"))

我得到了这样的解决方案:

List<Column> exprs = new ArrayList<>();
for (int i = 1; i < 7; i ++ ) {
exprs.add(functions.sum(functions.when(ds.col("date_diff").$less$eq(30*i)
.and(ds.col("call_type").isin(callTypeOut)),
ds.col("duration"))).as("caller_call_time_"+Integer.toString(i));

}
Dataset<Row> res = ds.groupBy(ds.col("uid")).agg(functions.max(ds.col("create_time")).as("create_time"),
exprs.toArray(new Column[exprs.size()]));

最佳答案

你可以:

  1. 使用之前的所有附加列创建一个数据框(数据集是一个数据框,与其他任何数据集相反),然后对新创建的列执行聚合。您可以循环创建列。

  2. 使用 Java 构建 UDAF(用户定义聚合函数)来处理您的自定义代码。

希望对你有帮助...

关于java - 如何在循环中生成Spark数据集聚合长expers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55236057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com