我想为我正在做的 map 操作在DataSet中为Row类型编写一个编码器。本质上,我不了解如何编写编码器。
以下是 map 操作的示例:In the example below, instead of returning Dataset<String>, I would like to return Dataset<Row>
Dataset<String> output = dataset1.flatMap(new FlatMapFunction<Row, String>() {
@Override
public Iterator<String> call(Row row) throws Exception {
ArrayList<String> obj = //some map operation
return obj.iterator();
}
},Encoders.STRING());
我知道,编码器需要编写如下字符串,而不是字符串:
Encoder<Row> encoder = new Encoder<Row>() {
@Override
public StructType schema() {
return join.schema();
//return null;
}
@Override
public ClassTag<Row> clsTag() {
return null;
}
};
但是,我不了解编码器中的clsTag(),并且我试图找到一个可以演示类似内容的运行示例(即用于行类型的编码器)
编辑-这不是所提问题的副本:Encoder error while trying to map dataframe row to updated row作为答案,它涉及在Spark 2.x中使用Spark 1.x(我没有这样做),我也在寻找Row类的编码器而不是解析一个错误。最后,我正在寻找Java而不是Scala中的解决方案。
最佳答案
答案是使用RowEncoder,数据集的架构使用StructType。
以下是使用数据集进行平面图操作的工作示例:
StructType structType = new StructType();
structType = structType.add("id1", DataTypes.LongType, false);
structType = structType.add("id2", DataTypes.LongType, false);
ExpressionEncoder<Row> encoder = RowEncoder.apply(structType);
Dataset<Row> output = join.flatMap(new FlatMapFunction<Row, Row>() {
@Override
public Iterator<Row> call(Row row) throws Exception {
// a static map operation to demonstrate
List<Object> data = new ArrayList<>();
data.add(1l);
data.add(2l);
ArrayList<Row> list = new ArrayList<>();
list.add(RowFactory.create(data.toArray()));
return list.iterator();
}
}, encoder);
关于java - 行类型Spark数据集的编码器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43238693/