我正在使用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()]));
答案 0 :(得分:1)
您可以:
之前创建带有所有其他列的数据框(数据集是一个数据框,与其他任何数据集相对),然后对新创建的列执行聚合。您可以循环创建列。
用Java构建将处理您的自定义代码的UDAF(用户定义的聚合函数)。
希望有帮助...