Cassandra Definitive Guide 这本书在这一点上是一个糟糕的资源,因为它已经过时了。从那时起,Cassandra 发生了很大变化,Hadoop 也是如此,因此 Cassandra-Hadoop 集成章节特别不可靠。
这是一个完整的工作 Cassandra 配置:
ConfigHelper.setRangeBatchSize(getConf(), 99);
final Job job = new Job(getConf(), "average");
final Configuration conf = job.getConfiguration();
ConfigHelper.setInputRpcPort(conf, "9160");
ConfigHelper.setInputInitialAddress(conf, cassHost);
ConfigHelper.setInputPartitioner(conf, "org.apache.cassandra.dht.Murmur3Partitioner");
ConfigHelper.setInputColumnFamily(conf, conf.get(keyspace), conf.get(inputCF));
//get all records
SlicePredicate predicate = new SlicePredicate().setSlice_range(new SliceRange(ByteBufferUtil.bytes(""), ByteBufferUtil.bytes(""), false, Integer.MAX_VALUE));
ConfigHelper.setInputSlicePredicate(conf, predicate);
ConfigHelper.setOutputInitialAddress(conf, cassHost);
ConfigHelper.setOutputRpcPort(conf, "9160");
ConfigHelper.setOutputPartitioner(conf, "org.apache.cassandra.dht.Murmur3Partitioner");
ConfigHelper.setOutputColumnFamily(conf, conf.get(keyspace), conf.get(outputCF));
您的线路的问题:
String value = new String(column.value());
正在尝试将其传递给String
构造函数。在旧版本的 Cassandra 中column.value()
返回byte[]
,但它现在返回一个ByteBuffer
. 如果底层数据实际上是一个字符串,您可以使用 Cassandra 对其ByteBufferUtil.string()
进行解码。所以你的新行看起来像这样:
String value = ByteBufferUtil.string(column.value());