我目前正在使用Hadoop和Cassandra来运行Map Reduce任务。
它工作正常,但我想允许reduce输出开始使用Map列类型将数据插入到Cassandra表中。
我试过只是简单地将值输出类型更改为Reducer中的Map,但这开始导致cassandra.hadoop实现内部问题,因为它始终需要List。
我试图更改OutputValueClass设置,但无济于事。
有没有其他人能够输出除List之外的东西,或者能够指出我的方向来理解它是如何实现的。
答案 0 :(得分:0)
我设法弄明白我想做什么,为回答我自己的问题而道歉,只是认为它可以帮助处于类似情况的人。或者能够告诉我,我的新思维方式也是错误的。
我实际上误解了减速器的KeyValueOut实际上在做什么。我的假设是,我可以将此值更改为我想写给Cassandra的任何内容,并且底层驱动程序只会将其读取。例如Map或Text或Blob。但是,我现在认为它总是必须是一个ByteBuffers列表,允许任何东西从Hadoop进入Cassandra。
我设法使用以下方法使用正确的类型:
private ByteBuffer ExampleForMapTypes(JSONObject data){
Map<String, String> mapper = new HashMap<>();
String user = data.get("Map_Left").toString();
String agent = data.get("Map_Right").toString();
mapper.put(user, agent);
return MapType
.getInstance(UTF8Type.instance, UTF8Type.instance)
.decompose(mapper);
}
分解方法将返回ByteBuffer,这反过来允许Cassandra驱动程序读取输出的内容并在查询中正确处理它。在此示例中,它将输出到Map
类型的Cassandra列