从 Cassandra 加载宽行到 C# 的最快方法是什么?
本文关键字:方法 是什么 加载 Cassandra | 更新日期: 2023-09-27 18:34:01
将单个(或几个(宽行从 Cassandra 加载到 C# 的最高效性能的方法是什么?我的宽行有 10.000-100.000 列。主键由多个值组成,但列键是单个字符串,列值是单个计数器(请参阅下面的架构(。
在 cqlsh 中使用"跟踪",我可以看到 Cassandra 可以在 44 m 中选择具有 17.000 列的宽行,但使用 Datastax 驱动程序将此数据一直加载到 C# 中需要 700 毫秒。有没有更快的方法?我需要在 50-100 毫秒内加载完整的宽行。(有没有更原生的方式?一种最小化网络流量的方法?更快的驱动程序?驱动程序的另一种配置?还是别的什么?
我实际上不需要所有 17.000 列。我只需要"支持">= 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();
如果要在检索大型结果集时获得最佳性能,则不应使用 Linq-to-cql 或任何其他映射组件。
您可以使用驱动程序自述文件中记录的技术检索行,在您的情况下,它将如下所示:
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);