Я хотел бы написать кодировщик для Тип строки в DataSet для операции с картой, которую я выполняю. По сути, я не понимаю, как писать кодировщики.

Ниже приведен пример операции карты:

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 () в кодировщике и пытаюсь найти работающий пример, который может продемонстрировать нечто подобное (то есть кодировщик для типа строки)

Изменить - это не копия упомянутого вопроса: Ошибка кодировщика при попытке сопоставить строку информационного кадра с обновленной строкой, поскольку в ответе говорится об использовании Spark 1.x в Spark 2.x (я этого не делаю), также я ищу кодировщик для строки класс, а не устранить ошибку. Наконец, я искал решение на Java, а не в Scala.

28
tsar2512 5 Апр 2017 в 21:13

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);
36
Saumya Suhagiya 26 Июн 2020 в 06:53

У меня была такая же проблема ... Encoders.kryo(Row.class)) работал на меня.

В качестве бонуса, документы настройки Apache Spark относятся к Kryo, так как он быстрее при сериализации «часто в 10 раз»:

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

8
Jim Bob 26 Янв 2018 в 16:41