sparkjava:agg在多个列上并重命名它们

wlp8pajw  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(571)

我想在我的数据集上对以前不知道的多个列进行分组,因此.agg()允许传递一个Map,其中键是列名,值是聚合名,例如,我可以这样做:

for(String column:columns)
        map.put(column, "sum");
    ds.groupBy("someColumn").agg(map)

在这之前还不错,但我想保留原来的列名,不要有这样的东西
“|总和(第1列)|总和(第12列)|…”
我尝试过这样做,但没有成功:

map.put(column, "sum alias " + column);

有没有可能用javaapi实现这一点?

oxosxuxt

oxosxuxt1#

试试这个-
我已将列名作为别名提供给 sum(column) ```
Dataset 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    |
     * +---+-----+
     */
实用程序-

Buffer toScalaSeq(List list) {
return JavaConversions.asScalaBuffer(list);
}

相关问题