【问题标题】:Reading rows in cassandra and de-serialzation issue在 cassandra 中读取行和反序列化问题
【发布时间】:2011-09-17 10:09:53
【问题描述】:

我想从一个列族中获取所有行并同时显示所有列。我试过这个:

// Static import of HFactory!

// First, insert the data
Mutator<String> mutator = HFactory.createMutator(fKeyspace, fStringS);
mutator.insert("fahrer1", "Fahrer", createStringColumn("first", "John"));
mutator.insert("fahrer2", "Fahrer", createStringColumn("first", "Vorname"));
mutator.insert("fahrer2", "Fahrer", createStringColumn("second", "Nachname"));
mutator.
    addInsertion("fahrer3", "Fahrer",
            createColumn("first", "Firstname", fStringS,
                    fStringS)).
    addInsertion("fahrer3", "Fahrer",
            createColumn("second", "Lastname", fStringS,
                    fStringS)).
    addInsertion("fahrer3", "Fahrer",
            createColumn("age", 29L, fStringS, fLongS))
    .execute();

// Now select..
CqlQuery<String, String, String> cqlQuery =
   new CqlQuery<String, String, String>(fKeyspace,fStringS,fStringS,fStringS);
cqlQuery.setQuery("SELECT * FROM ColumnFamily");

QueryResult<CqlRows<String, String, String>> result = cqlQuery.execute();

CqlRows<String, String, String> rows = result.get();
for (Row<String, String, String> row : rows.getList()) {
    System.out.println(row.getKey() + ":");
    for(HColumn<String, Object>col : row.getColumnSlice().getColumns()) {
        System.out.println(col.getName() + " : " + col.getValue());
        }
    }
}

问题是,所有具有长值的列都是空的。如果我将最后一个“参数化器”更改为对象,我会得到一个“CorruptedStreamException”。我该怎么做?

更新:这是使用 CLI 的输出

[default@Autorennen] list Fahrer;
Using default limit of 100
-------------------
RowKey: fahrer1
=> (column=first, value=John, timestamp=1308392358211000)
-------------------
RowKey: fahrer2
=> (column=first, value=SecondUpdated, timestamp=1308392358350000)
=> (column=second, value=584e6163686e616d65, timestamp=1308392358284000)
-------------------
RowKey: fahrer3
=> (column=age, value=000000000000001d, timestamp=1308392358286002)
=> (column=first, value=Firstname, timestamp=1308392358286000)
=> (column=second, value=4c6173746e616d65, timestamp=1308392358286001)

【问题讨论】:

  • 如果您通过 Cassandra CLI 查询同一个 ColumnFamily 会发生什么?您是否确认列族中存在预期数据?
  • 嗨 DNA 我更新了我的问题来回答你的问题 :)

标签: java cassandra hector


【解决方案1】:

ML 的回答: http://groups.google.com/group/hector-users/browse_thread/thread/8246ad59c9d5cf9d

另外,请看一下新的模板包。它提供了对类型化结果的更合理的检索。这是使用此类的入门指南: https://github.com/rantav/hector/wiki/Getting-started-%285-minutes%29

【讨论】:

  • 确实,这就是 ML 的答案 :-) 感谢您对模板的提示!我没有使用它,因为方法名称中的“Thrift”...... Hector 是 Thrift 的包装器,所以我认为这个调用会“脏”......我会尝试它们并再次编写 :-)
【解决方案2】:

您是否尝试过使用 byte[] 而不是 Object?所有 Cassandra 数据项的底层类型是字节数组。例如

QueryResult<CqlRows<String, String, byte[]>>

这是基于网络示例的猜测,因为我使用的是 Python 客户端而不是 Java...

您也可以尝试省略泛型:

CqlResult result = executeQuery("select * from ColumnFamily");
for (CqlRow row : result.getRows()) {
    System.out.println(new String (row.getKey()));
}

看看你会返回什么类型,如果有的话。

【讨论】:

  • 我会试试这个,听起来不错(它符合我几个小时前在用户组中得到的答案:-))。我将在此处发布正确的代码作为我的问题的更新!
  • 省略泛型不起作用:-/ byte[]-array 的东西看起来不错,正在完成一些测试...
猜你喜欢
  • 2014-12-30
  • 2011-04-05
  • 2021-04-13
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多