Несоответствие полей при создании типизированного набора данных Spark из таблицы cassandra - PullRequest
0 голосов
/ 26 января 2019

У меня есть таблица cassandra со схемой ниже:

> DESC customer;

CREATE TABLE mykeyspace.customer (
    id text PRIMARY KEY,
    accounts list<frozen<account_type>>,
    ...
);

> DESC TYPE account_type

CREATE TYPE mykeyspace.account_type (
    account_id text,
    type text,
    nickname text
);

Я пытаюсь загрузить данные из этой таблицы в набор типизированных данных

class Customer {
    private String id;
    private List<Account> accounts;
    // Getters and Setters...
}

class Account {
    private String account_id;
    private String type;
    private String nickname;
    // Getters and setters
}

Dataset<Customer> customers = sparkSession.read()
    .format("org.apache.spark.sql.cassandra")
    .option("spark.cassandra.connection.host", "localhost")
    .option("spark.cassandra.connection.port", 9042)
    .option("keyspace", "mykeyspace")
    .option("table", "customer")
    .load()
    .as(Encoders.bean(Customer.class));

Но после загрузки я замечаю, что некоторые поля в объектах Account заполнены некорректно. тип заполняется псевдонимом и т. д.

Что я делаю не так? Есть идеи, как решить эту проблему?

Я использую org.apache.spark:spark-sql_2.11:2.1.3 и com.datastax.spark:spark-cassandra-connector_2.11:2.3.2 зависимости.

UPDATE Я смог обойти эту проблему, сначала создав СДР, а затем создав набор данных из этого СДР.

RDD<Customer> rdd = javaFunctions(sparkSession.sparkContext())
    .cassandraTable("mykeyspace", "customer", mapRowTo(Customer.class)).rdd();
Dataset<Customer> customers = sparkSession.createDataset(rdd, Encoders.bean(Customer.class));

Но было бы неплохо найти правильное решение для этой проблемы.

...