Нужно ли мне создавать специальное семейство столбцов для столбцов-счетчиков?

#api #cassandra #thrift

#API #cassandra #бережливость

Вопрос:

Мой вопрос касается Cassandra 0.8 и Pelops. Я обнаружил, что Pelops использует ту же команду Thrift для чтения фрагмента столбцов, что и для фрагмента столбцов-счетчиков. Затем выполняется итерация по извлеченной коллекции объектов Thrift Column или SuperColumn, утверждая, что поле столбца (или counter_column) не равно null. Кажется очевидным, что для смешанного семейства столбцов выполнение любого из этих методов завершится неудачей.

Итак, требует ли Cassandra, чтобы все столбцы в семействе столбцов были одного типа?

Следующий код является фрагментом класса Selector из Pelops.

 private List<Column> getColumnsFromRow(final ColumnParent colParent, final Bytes rowKey, final SlicePredicate colPredicate, final ConsistencyLevel cLevel) throws PelopsException {
    IOperation<List<Column>> operation = new IOperation<List<Column>>() {
        @Override
        public List<Column> execute(IPooledConnection conn) throws Exception {
            List<ColumnOrSuperColumn> apiResult = conn.getAPI().get_slice(safeGetRowKey(rowKey), colParent, colPredicate, cLevel);
            return toColumnList(apiResult);
        }
    };
    return tryOperation(operation);
}

private List<CounterColumn> getCounterColumnsFromRow(final ColumnParent colParent, final Bytes rowKey, final SlicePredicate colPredicate, final ConsistencyLevel cLevel) throws PelopsException {
    IOperation<List<CounterColumn>> operation = new IOperation<List<CounterColumn>>() {
        @Override
        public List<CounterColumn> execute(IPooledConnection conn) throws Exception {
            List<ColumnOrSuperColumn> apiResult = conn.getAPI().get_slice(safeGetRowKey(rowKey), colParent, colPredicate, cLevel);
            return toCounterColumnList(apiResult);
        }
    };
    return tryOperation(operation);
}

private static List<Column> toColumnList(List<ColumnOrSuperColumn> coscList) {
    List<Column> columns = new ArrayList<Column>(coscList.size());
    for (ColumnOrSuperColumn cosc : coscList) {
        assert cosc.column != null : "The column should not be null";
        columns.add(cosc.column);
    }
    return columns;
}

private static List<CounterColumn> toCounterColumnList(List<ColumnOrSuperColumn> coscList) {
    List<CounterColumn> columns = new ArrayList<CounterColumn>(coscList.size());
    for (ColumnOrSuperColumn cosc : coscList) {
        assert cosc.counter_column != null : "The column should not be null";
        columns.add(cosc.counter_column);
    }
    return columns;
}
  

Ответ №1:

Итак, требует ли Cassandra, чтобы все столбцы в семействе столбцов были одного типа?

Да, в том смысле, что в настоящее время требуется, чтобы CF содержал все счетчики или все не-счетчики. Однако,

  • Это изменится, возможно, как только появится версия 0.8.1
  • не-счетчики определенно не обязательно должны иметь один и тот же тип данных (байты, длина, utf8 и т.д. Могут быть смешаны в одной строке)