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

Java 如何使用Hadoop将CQL集合对象保存到Cassandra?,java,hadoop,cassandra,cql,apache-spark,Java,Hadoop,Cassandra,Cql,Apache Spark,我使用Spark Hadoop API从Cassandra获取数据并将结果保存到Cassandra。 对于行值,如果列类型为long,则这是使用CqlOutputFormat adapter For Hadoop向Cassandra发送数据的方法: val outVal = new java.util.ArrayList[ByteBuffer](1) outVal.add(ByteBufferUtil.bytes(count.longValue())) 但是,当列类型为set时,我无法使其工作

我使用Spark Hadoop API从Cassandra获取数据并将结果保存到Cassandra。 对于行值,如果列类型为long,则这是使用CqlOutputFormat adapter For Hadoop向Cassandra发送数据的方法:

val outVal = new java.util.ArrayList[ByteBuffer](1)
outVal.add(ByteBufferUtil.bytes(count.longValue()))
但是,当列类型为
set
时,我无法使其工作。我试图用ObjectOutputStream序列化java.util.Set对象,但thrift客户端抛出了
InvalidRequestException(原因:字符串未验证)。


似乎它希望outVal是一个字符串值。我查看了Cassandra中SetSerializer和CollectionSerializer类的源代码,Cassandra似乎对集合对象使用自定义序列化。Hadoop CQL3 API提供了一种序列化集合对象的方法,还是我必须找到一种从外部使用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();
listbbs=newarraylist(List.size());
int size=0;
用于(字符串:列表)
{
ByteBuffer bb=ByteBufferUtil.bytes(elt);
bbs.add(bb);
尺寸+=2+bb.剩余();
}
ByteBuffer结果=ByteBuffer.allocate(2+大小);
result.putShort((short)list.size());
对于(ByteBuffer bb:bbs)
{
result.putShort((short)bb.remaining());
result.put(bb.duplicate());
}
return(ByteBuffer)result.flip();
    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();