为了账号安全,请及时绑定邮箱和手机立即绑定

如何在循环中生成 Spark 数据集聚合长实验程序?

如何在循环中生成 Spark 数据集聚合长实验程序?

皈依舞 2022-08-17 16:37:25
我正在使用Java Spark来统计数据集。我需要通过许多exper聚合数据集,因此代码又长又难看。expers有一些共同的逻辑,我可以用循环生成exper吗?下面是代码示例,实际代码有数百行重复代码: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 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您可以:

  1. 创建一个数据帧(数据集是一个数据帧,与任何其他列的数据集相对),其中包含所有其他列,然后对新创建的列执行聚合。您可以在循环中创建列。

  2. 构建一个 UDAF(用户定义的聚合函数),该函数将在 Java 中处理您的自定义代码。

希望它有帮助...


查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号