我们有cassandra专栏系列。 每行有多列。列具有名称,但值为空。 如果我们有5-10行键,我们如何找到出现在所有这些键中的列名。 e.g。
row1: php, programming, accounting
row2: php, bookkeeping, accounting
row3: php, accounting
必须返回:
result: php, accounting
请注意,我们无法轻松将整行加载到内存中,因为它可能包含1M +列 解决方案不需要快速。
答案 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;最大。这将是你的交集。