我有一个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)
);
答案 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/