gpt4 book ai didi

java - 如何使用Hadoop将CQL集合对象保存到Cassandra?

转载 作者:行者123 更新时间:2023-12-02 21:47:38 25 4
gpt4 key购买 nike

我正在使用Spark Hadoop API从Cassandra获取数据并将结果保存到Cassandra。
对于行值,如果列类型很长,这是使用Hadoop的CqlOutputFormat适配器将数据发送到Cassandra的方法:

val outVal = new java.util.ArrayList[ByteBuffer](1)
outVal.add(ByteBufferUtil.bytes(count.longValue()))

但是,当列类型为 set<text>时,我无法使其工作。我尝试使用ObjectOutputStream序列化java.util.Set对象,但是节俭的客户端抛出 InvalidRequestException(why:string didn't validate.)
val outVal = new java.util.ArrayList[ByteBuffer](1)
val byteOut = new ByteArrayOutputStream()
val out = new ObjectOutputStream(byteOut)
out.writeObject(data)
byteOut.close()
outVal.add(ByteBuffer.wrap(byteOut.toByteArray))
(outKey, outVal)

似乎期望outVal是一个字符串值。我查看了Cassandra中SetSerializer和CollectionSerializer类的源代码,似乎Cassandra对Collection对象使用了自定义序列化。 Hadoop CQL3 API是否提供一种序列化Collection对象的方法,还是我必须找到一种从外部使用Cassandra内部类的方法?

最佳答案

看来目前唯一的解决方案是从Cassandra源代码复制序列化代码。这是Cassandra内部处理集合对象的方式:

    List<ByteBuffer> bbs = new ArrayList(list.size());
int size = 0;
for (String elt : list)
{
ByteBuffer bb = ByteBufferUtil.bytes(elt);
bbs.add(bb);
size += 2 + bb.remaining();
}

ByteBuffer result = ByteBuffer.allocate(2 + size);
result.putShort((short)list.size());
for (ByteBuffer bb : bbs)
{
result.putShort((short)bb.remaining());
result.put(bb.duplicate());
}
return (ByteBuffer)result.flip();

关于java - 如何使用Hadoop将CQL集合对象保存到Cassandra?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23839988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com