【问题标题】:How does a custom type dataset call the groupBy method?自定义类型数据集如何调用 groupBy 方法?
【发布时间】:2021-06-09 01:17:47
【问题描述】:

我通过 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 中的异常:无法解析(值)中的列名“source”

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

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

【问题讨论】:

    标签: java apache-spark apache-spark-dataset


    【解决方案1】:

    例外的原因是:您的数据集没有聚合所需的列。您可以在创建数据集时使用 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|
     +------+------+----------+
    */
    

    【讨论】:

      猜你喜欢
      • 2022-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2018-06-28
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多