У меня есть таблица 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));
Но было бы неплохо найти правильное решение для этой проблемы.