1

我有一个像这样的 cassandra 表:

keyspace_name| columnfamily_name | column_name | component_index |
-------------+-------------------+-------------+-----------------+
          aw |      test         |  as_of_date |               0 |
          aw |      test         |        data |               1 |
          aw |      test         |   record_id |            null |
          aw |      test         | upload_time |               1 |

而且我不会创建将打印(例如 slf4j)行的触发器,这些行应该以下一种格式插入:

key = key1
column_name1=value1
column_name2=value2
...
column_namen=valuen

是否可以在触发器中获取列名?我尝试了互联网上的示例,但它打印的数据不正确。

public Collection<RowMutation> augment(ByteBuffer key, ColumnFamily update) {
    String localKey = new String(key.array(), Charset.forName("UTF-8"));
    logger.info("key={}.", localKey);

    for (Column cell : update) {
        try {
            String name = ByteBufferUtil.string(cell.name());
            logger.info("name={}.", name);

            String value = ByteBufferUtil.string(cell.value());
            logger.info("value={}.", value);               
        } catch (Exception e) {
            logger.info("Exception={}.", e.getMessage());
        }
    }

据我了解,我必须将cell.value()转换为特定的数据类型,如下所示:

Date date = TimestampType.instance.compose(cell.value());

但我不知道,如何检测字段类型,我不明白为什么我不能使用 ByteBufferUtil.string(cell.name()) 获取列名。

4

1 回答 1

0

要正确格式化单元名称和值,您必须使用 CFMetaData。代码的正确版本应该是:

public Collection<Mutation> augment(ByteBuffer key, ColumnFamily update)
{
    CFMetaData cfm = update.metadata();
    String localKey = cfm.getKeyValidator().getString(key);
    logger.info("key={}.", localKey);

    for (Cell cell : update) 
    {
       try 
       {
           String name = cfm.comparator.getString(cell.name());
           logger.info("name={}.", name);

           String value = cfm.getValueValidator(cell.name()).getString(cell.value());
           logger.info("value={}.", value);               
       } catch (Exception e) {
           logger.info("Exception={}.", e.getMessage());
       }
   }
   return Collections.emptyList();

}

于 2014-08-20T09:56:11.117 回答