如何从Dataset中获取单个单元格值且不使用col方法?
Spark Dataset 无需col方法获取指定单元格的优雅实现
下面是两种完全不需要调用col()方法的实现方案,写法更简洁直观:
- 方案1:使用SQL表达式过滤(适用弱类型Dataset
)
直接给filter传入字符串格式的SQL条件,select也支持直接传入列名字符串,配合first()方法省去收集列表再取第一个元素的冗余操作:
// 写法1:先选列再取行 Object cellValue = dataset.filter("id = " + index) .select(nameOfColumn) .first() .get(0); // 写法2:直接取过滤后行的指定列,省略select步骤更简洁 Object cellValue = dataset.filter("id = " + index) .first() .getAs(nameOfColumn);
注意:如果id为字符串类型,需要给值加单引号,即
filter("id = '" + index + "'")
- 方案2:使用lambda表达式过滤(适用强类型Dataset
)
如果你的Dataset是绑定了POJO类的强类型实例,可以直接用lambda做过滤,获得编译期类型检查能力:
// 假设Dataset泛型为对应POJO类User,包含id属性 Object cellValue = dataset.filter((FilterFunction<User>) user -> user.getId().equals(index)) .first() .getAs(nameOfColumn);
- 异常兼容优化
如果不能保证过滤后一定存在匹配行,可以用take(1)避免first()抛出的无匹配异常:
List<Row> matchedRows = dataset.filter("id = " + index).take(1); Object cellValue = matchedRows.isEmpty() ? null : matchedRows.get(0).getAs(nameOfColumn);
内容的提问来源于stack exchange,提问作者John Campbell
相关产品推荐
相关产品推荐

