我尝试在任意数据集上使用Dataframe地图功能。但是,我不明白你将如何映射Row->行。 spark sql文档中没有给出任意数据的例子:
Dataset<Row> original_data = ...
Dataset<Row> changed_data = original_data.map(new MapFunction<Row,Row>{
@Override
public Row call(Row row) throws Exception {
Row newRow = RowFactory.create(obj1,obj2);
return newRow;
}
}, Encoders.bean(Row.class));
然而,这不起作用,因为需要某种编码器? 如何映射到通用行?
答案 0 :(得分:2)
如果obj1和obj2不是基本类型,则将它们的模式表示为StructType以创建行编码器。我建议不要使用Row类型,创建存储obj1和obj2的自定义bean,然后在map
转换中使用该自定义bean编码器。
行类型:
StructType customStructType = new StructType();
customStructType = customStructType.add("obj1", DataTypes.< type>, false);
customStructType = customStructType.add("obj2", DataTypes.< type >, false);
ExpressionEncoder<Row> customTypeEncoder = null;
Dataset<Row> changed_data = original_data.map(row->{
return RowFactory.create(obj1,obj2);;
}, RowEncoder.apply(customStructType));
自定义Bean类型:
class CustomBean implements ....{
Object obj1;
Object obj2;
....
}
Dataset<CustomBean> changed_data = original_data.map(row->{
return new CustomBean(obj1,obj2);
}, Encoders.bean(CustomBean));