java - 自定义类型数据集如何调用 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 时,会抛出异常。线程“主”org.apache.spark.sql.AnalysisException 中的异常:无法解析(值)中的列名“源”
我想知道自定义类型数据集是否可以调用方法 groupBy。行类型数据集是唯一可以调用此方法而不抛出异常的吗?
如何聚合自定义类型数据集?
解决方案
例外的原因是:您的数据集没有聚合所需的列。您可以在创建数据集时使用 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|
+------+------+----------+
*/
推荐阅读
- firebase - Firebase 和 Firestore - 将多个应用程序分组到一个项目中 - 身份验证如何工作?
- python - Python 3.6 相当于 md5 digest() 方法?
- performance - 最佳缓冲区大小以避免最近 i7 / i9 CPU 的缓存未命中
- javascript - 在使用函数之前验证函数的所有输入是否是最佳实践?
- c# - NuGet 更新后的程序集冲突
- vb.net - 如何使用复选框将 2 个表加入 DataGridView 并将 DGV 的状态保存回数据库
- python - 如何在Python中的嵌套字典中获取层次结构下的项目?
- python - jupyter-notebook:循环打印精细表格
- javascript - 未捕获的类型错误:无法在 HTMLButtonElement.ctrlAddItem 的 Object.addItem (app.js:41) 处读取未定义的属性“长度”
- service - Helm 部署与服务