我有一个具有以下架构的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
依赖项。
更新 通过首先创建RDD,然后从该RDD创建数据集,我能够解决此问题。
RDD<Customer> rdd = javaFunctions(sparkSession.sparkContext())
.cassandraTable("mykeyspace", "customer", mapRowTo(Customer.class)).rdd();
Dataset<Customer> customers = sparkSession.createDataset(rdd, Encoders.bean(Customer.class));
但是,找到一个解决此问题的适当方法将是一个好习惯。