java - Spark java:在多个列上聚合并重命名它们
问题描述
我想在我之前不知道的多个列上对我的数据集进行分组,因此.agg()允许传递一个Map,其中键是列名,值是聚合名称,例如例如我可以这样做:
for(String column:columns)
map.put(column, "sum");
ds.groupBy("someColumn").agg(map)
到这里为止都很好,但我想保留原来的列名并且没有这样的东西
'|sum(column1)|sum(column12)|...'
我试过这样做,但没有奏效:
map.put(column, "sum alias " + column);
可以用java api做到这一点吗?
解决方案
试试这个-
我已将列名作为别名提供给
sum(column)
Dataset<Row> df = spark.range(2).withColumn("value", lit(2));
df.show(false);
df.printSchema();
/**
* +---+-----+
* |id |value|
* +---+-----+
* |0 |2 |
* |1 |2 |
* +---+-----+
*
* root
* |-- id: long (nullable = false)
* |-- value: integer (nullable = false)
*/
Map<String, String> map = new HashMap<>();
for(String column:df.columns())
map.put(column, "sum");
List<Column> cols = map.entrySet().stream().map(c -> expr(String.format("%s(%s) as %s", c.getValue(), c.getKey(), c.getKey())))
.collect(Collectors.toList());
df.agg(cols.get(0), toScalaSeq(cols.subList(1, cols.size()))).show(false);
/**
* +---+-----+
* |id |value|
* +---+-----+
* |1 |4 |
* +---+-----+
*/
效用-
<T> Buffer<T> toScalaSeq(List<T> list) {
return JavaConversions.asScalaBuffer(list);
}
推荐阅读
- javascript - 用于跟踪 Open Weather Map API 调用的 Javascript 计数器
- python - 无法重现自然图像的光谱功率随频率下降 1/f**2 的说法
- flutter - 从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点
- c# - 导致问题的服务分离问题
- postgresql - 在分区表上追加成本非常高
- python - 想知道如何从使用列表中获取奇数
- vba - 女士 Access VBA 太快无法刷新 excel 列表对象
- r - r 秩和不同于单个向量和由这些向量组成的矩阵
- reactjs - 将 Highcharts 对象引用为 React 元素(打字稿)
- jquery - 为什么 jquery 代码在 capybara 测试中不起作用