1

アプリケーションが頻繁に変更され、機能が頻繁に追加される場合、Cassandra は優れているといつも読んでいます。

固定スキーマがないため、非常に大きなテーブルのデータベースを何時間もフリーズさせる可能性のある ALTER TABLE クエリを実行する代わりに、必要に応じて行に列を追加できます。

ただし、解決できない仮想の問題があります。私が持っているとしましょう:

CREATE COLUMN FAMILY Students
    with comparator='CompositeType(UTF8Type,UTF8Type),
    and key_validation_class=UUIDType;

各生徒にはいくつかの一般的な列 (meta:username、meta:password、meta:surname など) があり、さらに各生徒は N 個のコースに従うことができます。この NN 関係は、非正規化を使用して解決され、各生徒 (コース:ID1、コース:ID2) に N 列が追加されます。

反対側には、各行に次のすべての学生 UUID が含まれるコース CF があるとします。

したがって、「XXX が続いているコースはどれか」と「YYY のコースを受講している学生はどれか」を尋ねることができます。

問題は、2 番目の列ファミリーを作成しなかった場合はどうなるかということです。おそらく、アプリケーションが作成された時点では、学生が特定のコースに従う必要はありませんでした。

これは簡単な例ですが、かなり一般的だと思います。「Cassandra では、関係ではなくクエリの観点から CF を計画します」。最初は必要ありませんでしたが、今はそのクエリが必要です。

数千のエントリを持つ学生のテーブルが与えられた場合、コース CF をどのように埋めますか? これはHadoop、Pig、またはHiveの仕事ですか(私はそれらのどれにも触れたことはありません。推測です)。

4

2 に答える 2

3

Pig(Hadoop統合を使用)は、CassandraStorageを使用してデータを読み取ったり、Cassandraに書き戻したりできるため、実際にはこのタイプの作業に最適です。これにより、最小限の時間とオーバーヘッドでジョブを実行するための並列処理機能が提供されます。それ以外の場合は、自分で抽出を行うための何かを記述してから、新しいCFを記述します。

これは、あるCFのデータセットから平均を計算し、それらを別のCFに出力するPigの例です。

rows = LOAD 'cassandra://HadoopTest/TestInput' USING CassandraStorage() AS (key:bytearray,cols:bag{col:tuple(name:chararray,value)});
columns = FOREACH rows GENERATE flatten(cols) AS (name,value);
grouped = GROUP columns BY name;
vals = FOREACH grouped GENERATE group, columns.value AS values;
avgs = FOREACH vals GENERATE group, 'Pig_Average' AS name, (long)SUM(values.value)/COUNT(values.value) AS average;    
cass_group = GROUP avgs BY group;   
cass_out = FOREACH cass_group GENERATE group, avgs.(name, average);
STORE cass_out INTO 'cassandra://HadoopTest/TestOutput' USING CassandraStorage();
于 2012-12-07T17:35:08.743 に答える
0

既存の cassandra ファイルを使用する場合は、データをアンワインドする必要があります。NOSQL ファイルは一方向であるため、これは Cassandra 自体で非常に時間のかかる操作になる可能性があります。データは、最初のファイルとは逆の順序で並べ替える必要があります。率直に言って、最初のファイルに入力するために使用された元のデータに戻り、そこからこの新しいファイルに入力する必要があると思います。

于 2014-01-18T06:01:06.770 に答える