提问者:小点点

行类型火花数据集的编码器


我想为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(),我正在尝试找到一个可以演示类似内容的运行示例(即行类型的编码器)

编辑-这不是提到的问题的副本:当试图将数据帧行映射到更新的行时编码器错误,因为答案谈到在Spark 2. x中使用Spark 1.x(我没有这样做),我也在寻找Row类的编码器,而不是解决错误。最后,我在Java中寻找解决方案,而不是在Scala中。


共2个答案

匿名用户

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

匿名用户

我也有同样的问题…Encoders. kryo(Row.class))为我工作。

作为奖励,Apache Spark调优文档引用了Kryo it,因为它的序列化速度“通常高达10倍”:

https://spark.apache.org/docs/latest/tuning.html