Flink cassandraOutputFormat元组需要冻结值

时间:2017-05-17 14:45:02

标签: java cassandra apache-flink

我有一个flink项目,它将作为批处理作业在cassandra表中插入数据。我已经有一个flink流项目,它正在写一个pojo到同一个cassandra表,但cassandraOutputFormat需要数据作为元组(希望改变接受像CassandraSink这样的pojos在某些时候)。所以这就是我拥有的pojo:

@Table(keyspace="mykeyspace", name="mytablename")
public class AlphaGroupingObject implements Serializable {

    @Column(name = "jobId")
    private String jobId;
    @Column(name = "datalist")
    @Frozen("list<frozen<dataobj>")
    private List<CustomDataObj> dataobjs;
    @Column(name = "userid")
    private String userid;

    //Getters and Setters
}

我从这个pojo中制作的元组数据集:

DataSet<Tuple3<String, List<CustomDataObj>, String>> outputDataSet = listOfAlphaGroupingObject.map(new AlphaGroupingObjectToTuple3Mapper());

以下是触发输出的行:

outputDataSet.output(new CassandraOutputFormat<>("INSERT INTO mykeyspace.mytablename (jobid, datalist, userid) VALUES (?,?,?);", clusterThatWasBuilt));

现在我遇到的问题是当我尝试运行它时,我在尝试将其输出到cassandra表时出现此错误:

Caused by: com.datastax.driver.core.exceptions.CodecNotFoundException: 
Codec not found for requested operation: [frozen<mykeyspace.dataobj> <-> flink.custom.data.CustomDataObj]

所以我知道当它是一个pojo时,我只需要在场上添加@Frozen注释,但我不知道如何为元组做到这一点。解决这个问题的最佳/正确方法是什么?或者我在做一些不必要的事情,因为实际上有一种方法可以通过cassandraOutputFormat发送pojos我还没找到?

提前感谢您提供的所有帮助!

修改

以下是CustomDataObj类的代码:

@UDT(name="dataobj", keyspace = "mykeyspace")
public class CustomDataObj implements Serializable {


    @Field(name = "userid")
    private String userId;

    @Field(name = "groupid")
    private String groupId;

    @Field(name = "valuetext")
    private String valueText;

    @Field(name = "comments")
    private String comments;

    //Getters and setters
}

编辑2

在Cassandra中包含CustomDataObj绑定的表模式和mytablename模式。

CREATE TYPE mykeyspace.dataobj (
    userid text,
    groupid text,
    valuetext text,
    comments text
);

CREATE TABLE mykeyspace.mytablename (
    jobid text,
    datalist list<frozen<dataobj>>,
    userid text,
    PRIMARY KEY (jobid, userid)
);

2 个答案:

答案 0 :(得分:0)

UDT课程

上添加CustomDataObj注释
@UDT(name = "dataobj")
public class CustomDataObj { 
    //...... 
}

<强>被修改

jobid注释更改为@Column(name = "jobid")并将dataobjs冻结注释更改为@Frozen

@Table(keyspace="mykeyspace", name="mytablename")
public class AlphaGroupingObject implements Serializable {

    @Column(name = "jobid")
    private String jobId;

    @Column(name = "datalist")
    @Frozen
    private List<CustomDataObj> dataobjs;
    @Column(name = "userid")
    private String userid;

    //Getters and Setters
}

答案 1 :(得分:0)

我相信我找到了比向cassandraOutputFormat提供元组更好的方法,但它在技术上仍然没有回答这个问题所以我不会将此标记为答案。我最终使用了cassandra的对象映射器,因此我可以将pojo发送到表中。仍然需要验证数据是否已成功运行,并且所有内容都按照实现的方式正常运行,但我觉得这可以帮助任何遇到类似问题的人。

以下是概述解决方案的文档:http://docs.datastax.com/en/developer/java-driver/2.1/manual/object_mapper/using/