自定义类型数据集如何调用 groupBy 方法?

问题描述

我通过 spark 创建了一个自定义类型的数据集。

public class keyvaluePair {
    String source;
    String target;
    int value;
    getter...
    setter...
}
...
List<keyvaluePair> list = generateList();
Dataset<keyvaluePair> dataset = spark.createDataset(list,Encoders.kryo(keyvaluePair.class));
Dataset<Row> agg = dataset.groupBy("source","target").agg(avg("value"));

数据集调用groupBy方法时,会抛出异常。 线程“main”org.apache.spark.sql.AnalysisException 中的异常:无法在(值)中解析列名“源”

不知自定义类型数据集能否调用groupBy方法。 Row 类型的数据集是唯一可以调用这个方法而不抛出异常的吗?

如何聚合自定义类型数据集?

解决方法

异常的原因是:您的数据集没有聚合所需的列。您可以在创建数据集时使用 Encoders.bean(class) 获得预期结果。

代码:

 public class DatasetAggregation {
     public static void main(String[] args) {
        SparkSession spark = SparkSession.builder().master("local[*]").getOrCreate();
        List<KeyValuePair> list = generateList();
        Dataset<KeyValuePair> dataset = spark.createDataset(list,Encoders.bean(KeyValuePair.class));
        Dataset<Row> agg = dataset.groupBy("source","target").agg(avg("value"));
        agg.show();
    }

    public static List<KeyValuePair> generateList() {
        KeyValuePair k = new KeyValuePair();
        k.setSource("a");
        k.setTarget("b");
        k.setValue(10);
        return Arrays.asList(k,k,k);

    }
}

 /* output
 +------+------+----------+
 |source|target|avg(value)|
 +------+------+----------+
 |     a|     b|      10.0|
 +------+------+----------+
*/