在Spark SQL中使用带有任意行的数据集上的映射

时间:2017-10-04 04:27:34

标签: java apache-spark apache-spark-sql spark-dataframe

我尝试在任意数据集上使用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));

然而,这不起作用,因为需要某种编码器? 如何映射到通用行?

1 个答案:

答案 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));