如何在循环中生成Spark数据集聚合长专家?

问题描述 投票:0回答:1

我正在使用Java Spark来启动数据集。

我需要通过许多expers聚合数据集,因此代码很长而且很难看。 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()]));
java apache-spark apache-spark-sql apache-spark-dataset
1个回答
1
投票

你可以:

  1. 创建您的数据框(数据集是一个数据框,与其他任何数据集相对),之前包含所有其他列,然后对新创建的列执行聚合。您可以在循环中创建列。
  2. 构建一个UDAF(用户定义的聚合函数),用Java处理您的自定义代码。

希望能帮助到你...

© www.soinside.com 2019 - 2024. All rights reserved.