2

cassandraカラムファミリーがあります。各行には複数の列があります。列には名前がありますが、値は空です。5〜10行のキーがある場合、これらすべてのキーに表示される列名を見つける方法。例えば

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

返す必要があります:

result: php, accounting

1M以上の列が含まれている可能性があるため、行全体をメモリに簡単にロードできないことに注意してください。ソリューションは高速である必要はありません。

4

3 に答える 3

1

複数の行を交差させるには、最初に2つを交差させ、次に結果を3番目と交差させる必要があります。

cassandraでは、列名でデータをクエリできるように見えますが、これは比較的高速な操作です。

したがって、最初に10k行の列スライスを取得します。列名のリストを作成します(PHP Cassaの場合-それらを配列に入れます)。次に、2行目からそれらを選択します。

コードは次のようになります。

$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
于 2012-08-02T21:05:26.777 に答える
0

列名は並べ替えられ、各行のイテレータを作成できます(このイテレータは、日付の一部を一度にロードします。たとえば、10kの列)。次に、各イテレータを優先キューに入れます(次の列名で)。同じ列名のイテレータをk回キューに入れる場合、これはすべての行に共通の名前です。それ以外の場合は、次の要素に移動してイテレータをキューに戻します。

于 2012-08-02T17:30:54.923 に答える
0

次のように、Hadoop map/reduceジョブを使用できます。

  • マップ出力キー=列名

  • マップ出力値=行キー

  • レデューサーは、各列の行キーをカウントし、次のスキーマを使用して列名とカウントをCFに出力します。

    キー:[列名] {カウント:[カウント]}

  • 次に、このCFから逆の順序でカウントを照会できます。最初のレコードが最大になるため、値が最大未満になるまで反復を続けることができます。これがあなたの交差点になります。

于 2012-08-02T19:57:27.633 に答える