查询nutch 2表结果来自cassandra 2剂量看起来不对

时间:2014-04-27 18:17:56

标签: java cassandra nutch

我正在使用Nutch 2.2.1和Cassandra 2抓取页面。为了测试我只是向Cassandra注入一个网址并探索数据库。

使用CQL我可以查询网页密钥空间中的表

cqlsh:单纯> select * from webpage.f;

 key                                  | column1 | value
--------------------------------------+---------+--------------------
 0x6564752e6373752e7777773a687474702f |  0x6669 |         0x00278d00
 0x6564752e6373752e7777773a687474702f |    0x73 |         0x3f800000
 0x6564752e6373752e7777773a687474702f |  0x7473 | 0x00000145a266703e

如果我将这些十六进制字节转换为字符串,这很好。密钥将是恢复的网址。

然后我编写java代码,使用datastax java driver 2(http://www.datastax.com/documentation/developer/java-driver/2.0/java-driver/whatsNew2.html

读取表f

我按照示例代码

Cluster cluster = Cluster.builder().addContactPoint("10.20.104.181").build();
Session session = cluster.connect();
ResultSet results = session.execute("SELECT * FROM webpage.f");
for (Row row : results) {

            System.out.println("Key");
        System.out.println(toStrFromByteBuffer(row.getBytes("key")));
        System.out.println("column1");
        System.out.println(toStrFromByteBuffer(row.getBytes("column1")));
        System.out.println("value");
        System.out.println(toStrFromByteBuffer(row.getBytes("value")));

}
cluster.close();



public static String toStrFromByteBuffer(ByteBuffer buffer)
    {
        byte[] ar=buffer.array();
        System.out.println(ar.length);
        return new String(ar,Charset.forName("UTF-8"));
    }

结果如下。您可以看到row.getBytes(" key")返回整行数据而不是特定列值。

有些高手帮忙吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

Nutch将其数据存储在f列系列中 BytesType 。列名称存储为 UTF8Type 。 如果要将数据作为String获取,则必须先将其转换。一行完全存储在ByteBuffer中。在您的示例中,您将整个字节缓冲区转换为String,它将为您提供整行。当您选择一行时,您将获得该行的当前位置限制。所以你必须从begin读取:缓冲区当前指针位置到缓冲区限制。例如,在" cnt"中获取网站内容字段:

// This is the byte buffer you get from selecting column "cnt"
ByteBuffer buffer;
int length = buffer.limit() - buffer.position();

byte[] cellValue = new byte[length];

buffer.get(cellValue, 0, length);

return new String(cellValue, Charset.forName("UTF-8"));