相交的cassandra行

时间:2012-07-31 22:18:27

标签: cassandra intersect

我们有cassandra专栏系列。 每行有多列。列具有名称,但值为空。 如果我们有5-10行键,我们如何找到出现在所有这些键中的列名。 e.g。

row1: php, programming, accounting
row2: php, bookkeeping, accounting
row3: php, accounting

必须返回:

result: php, accounting

请注意,我们无法轻松将整行加载到内存中,因为它可能包含1M +列 解决方案不需要快速。

3 个答案:

答案 0 :(得分:1)

为了做几行的交集,我们需要先将它们中的两个相交,然后将结果与第三个相交,依此类推。

在cassandra中,我们可以按列名查询数据,这是相对较快的操作。

所以我们首先获得10k行的Column Slice。制作列名列表(在PHP Cassa中 - 将它们放在数组中)。然后从第二行中选择那些。

代码可能如下所示:

$x = $cf->get($first_key, <some column slice>);

$column_names = array();
foreach(array_keys($x) as $k)
   $column_names[] = $k;

$result = $cf->get($second_key, $column_slice = null, $column_names);

// write result somewhere, and proceed with next slice

答案 1 :(得分:0)

您对列的名称进行了排序,您可以为每一行创建一个迭代器(此迭代器一次加载日期的部分,例如10k列)。现在将每个迭代器放入一个优先级队列(按下一个列名称)。如果你使用相同列名的k次迭代器排队,那么这是所有行之间的通用名称,在另一种情况下我们移动到下一个元素并将迭代器返回队列。

答案 2 :(得分:0)

您可以按如下方式使用Hadoop map / reduce作业:

  • 地图输出键=列名称

  • 映射输出值=行键

  • Reducer计算每列的行键并输出列名称&amp;使用以下架构计数到CF:

    key:[列名] {   数:[数量] }

  • 然后,您可以按相反的顺序查询此CF的计数。第一条记录将是最大值,因此您可以继续迭代,直到值<&lt;最大。这将是你的交集。