从cassandra表创建类型化的Spark数据集时字段不匹配

时间:2019-01-26 17:05:21

标签: java apache-spark cassandra apache-spark-sql apache-spark-dataset

我有一个具有以下架构的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.3com.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));

但是,找到一个解决此问题的适当方法将是一个好习惯。

0 个答案:

没有答案