我正在使用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")返回整行数据而不是特定列值。
有些高手帮忙吗?
答案 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"));