Как преобразовать Dataset в JavaRDD в java

как преобразовать Data<Row> в javaRDD<User>?

Я пытался вытащить из базы список с большим количеством колон и столкнулся с такой проблемой что мне приходится указывать место каждой колоны и ее значение, как можно получить без всего этого?

Вот мой код

        SparkConf sparkConf = new SparkConf()
            .setMaster("local[*]")
            .setAppName("test");

    SparkContext sparkContext = new SparkContext(sparkConf);

    SparkSession session = new SparkSession(sparkContext);

    DataFrameReader dataFrameReader = session
            .read()
            .format("jdbc")
            .option("url", "jdbc:postgresql://10.100.0.4:5432/refund_service")
            .option("driver", "org.postgresql.Driver")
            .option("dbtable", "refunds")
            .option("user", "smartplaza")
            .option("password", "smartplaza");

    Encoder<Something> somethingEncoder = Encoders.bean(Refund.class);

    Dataset<Row> response = dataFrameReader.load();

    JavaRDD<Something> rsomethingJavaRDD = response.javaRDD().map(new Function<Row, Refund>() {
        @Override
        public Something call(Row row) throws Exception {
            return new Something(row.getLong(0),
                    row.getTimestamp(1), row.getTimestamp(2),row.getTimestamp(3),
                    row.getDouble(4),
                    row.getDouble(5),
                    row.getDouble(6),
                    row.getLong(7),
                    row.getLong(8),
                    row.getDouble(9),
                    row.getLong(10),
                    row.getDouble(11),
                    (Long) row.get(12),
                    (Long) row.get(13),
                    (Long) row.get(14),
                    row.getBoolean(15),
                    (Long) row.get(16),
                    (Long) row.get(17),
                    row.getDouble(18),
                    row.getDouble(19),
                    (Long) row.get(20),
                    (Long)row.get(21));
        }
    });

    Dataset<Something> somethingDataset = session.createDataset(refundJavaRDD.rdd(),somethingEncoder);

Ответы (1 шт):

Автор решения: Alex Ott

Надо просто использовать функцию .as(encoder) как описано в документации. Что-то вроде:

Encoder<Refund> refundEncoder = Encoders.bean(Refund.class);
Dataset<Refund> response = dataFrameReader.load().as(refundEncoder);
→ Ссылка