Spark java:聚合多个列并重命名它们
Spark java: agg on multiple columns and rename them
我想在我的数据集上对我之前不知道的多个列进行 group by,所以 .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 来做到这一点?
试试这个-
I've provided the column name as alias to 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);
}
我想在我的数据集上对我之前不知道的多个列进行 group by,所以 .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 来做到这一点?
试试这个-
I've provided the column name as alias to
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);
}