Каков самый быстрый способ загрузить широкую строку из Cassandra в C #?

Каков наиболее эффективный способ загрузки одной (или нескольких) широких строк из Cassandra в C #? В моих широких строках 10 000–100 000 столбцов. Первичные ключи состоят из нескольких значений, но ключ столбца представляет собой одну строку, а значение столбца представляет собой один счетчик (см. Схему ниже).

Используя «трассировку» в cqlsh, я вижу, что Cassandra может выбрать широкую строку с 17 000 столбцов на расстоянии 44 м, но загрузка этих данных полностью в C # с использованием драйвера Datastax занимает 700 мс. Есть ли более быстрый способ? Мне нужно загрузить полный широкий ряд за 50-100 мс. (Есть ли более родной способ? Способ минимизации сетевого трафика? Более быстрый драйвер? Другая конфигурация драйвера? Или что-то еще?)

На самом деле мне не нужны все 17000 столбцов. Мне просто нужны столбцы, в которых «поддержка»> = 2, или первые 1000 столбцов, отсортированные по убыванию «поддержка». Но поскольку «поддержка» - это значение моего столбца, я не знаю никакого способа сделать такой запрос в CQL.

Это моя таблица:

CREATE TABLE real_time.grouped_feature_support (
    algorithm_id int,
    group_by_feature_id int,
    select_feature_id int,
    group_by_feature_value text,
    select_feature_value text,
    support counter,
    PRIMARY KEY ((algorithm_id, group_by_feature_id, select_feature_id, group_by_feature_value), select_feature_value)

Это мой способ доступа к данным с помощью драйвера Datastax:

var table = session.GetTable<GroupedFeatureSupportDataEntry>();
var query = table.Where(x => x.CustomerAlgorithmId == customerAlgorithmId
    && x.GroupByFeatureId == groupedFeatureId
    && myGroupedFeatureValues.Contains(x.GroupByFeatureValue)
    && x.GroupByFeatureValue == groupedFeatureValue
    && x.SelectFeatureId == selectFeatureId)
    .Select(x => new
    {
        x.GroupByFeatureValue,
        x.SelectFeatureValue,
        x.Support,
    })
    .Take(1000000);
var result = query.Execute();

person user628904    schedule 12.12.2014    source источник


Ответы (1)


Если вы ищете максимальную производительность при получении большого набора результатов, вам не следует использовать компонент сопоставления, такой как Linq-to-cql или любой другой.

Вы можете получить строки с помощью метода , описанного в файле readme для драйвера , в вашем случае это будет примерно так:

var query = "SELECT * from grouped_feature_support WHERE" + 
            " algorithm_id = ? AND group_by_feature_id = ? " +
            " AND select_feature_id = ? AND group_by_feature_value = ?";
//Prepare the query once in your application lifetime
var ps = session.Prepare(query);
//Reuse the prepared statement by binding different parameters to it
var rs = session.Execute(ps.Bind(parameters));
foreach (var row in rs)
{
  //The enumerator will yield all the rows from Cassandra
  //Retrieving them in the back in blocks of 5000 (determined by the pagesize).
}
//You can also use a IEnumerable<T> Linq Extensions to filter
var filteredRows = rs.Where(r => r.GetValue<long>("support") > 2);
person jorgebg    schedule 16.12.2014
comment
Можно ли минимизировать нагрузку на сеть, переместив требование поддержки ›= 2 в кластер, или ввести заказ по описанию поддержки и взять верх в кластере? - person user628904; 17.12.2014
comment
Нет, с Cassandra невозможно выполнить фильтр на стороне сервера так, как вы этого хотите (по крайней мере, до C * 3.0) - person jorgebg; 17.12.2014