1

私はこのようなカサンドラテーブルを持っています:

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 に答える