2

[timestamp、long]として複合キーを使用して列ファミリーを作成してクエリする必要があります。また、クエリ中にタイムスタンプ(xxxとyyyの間のタイムスタンプなど)の範囲クエリを実行したいこれは可能ですか?

現在、私は本当に面白いことをしています(私はそれが正しくないことを知っています)。指定された範囲のタイムスタンプ文字列を使用してキーを作成し、longと連結します。

like ,
1254345345435-1234
3423432423432-1234
1231231231231-9999

キーのセットをhectorapiに渡します。(したがって、1か月の日付範囲があり、毎分データが必要な場合は、30 * 24 * 60 * [2次キーの数-長い]を作成します)

複合キーで連結の問題を解決できます。しかし、クエリの部分は私が理解しようとしていることです。

私が理解している限り、RandomPartitionerを使用しているため、キーはMD5チェックサムであるため、範囲に基づいて実際にクエリを実行することはできません。この種のユースケースの理想的な設計は何ですか?

私のスキーマと要件は次のとおりです:(実際のcsh)

    CREATE TABLE report(
        ts timestamp,
        user_id long,
        svc1 long,
        svc2 long,
        svc3 long,
        PRIMARY KEY(ts, user_id));

select from report where ts between (123445345435 and 32423423424) and user_id is in (123,567,987)
4

3 に答える 3

2

複合キーの最初のコンポーネントに対して範囲クエリを実行することはできません。代わりに、daystamp (現在の日の午前 0 時の UNIX エポック) などのセンチネル値をキーとして記述し、複合列を timestamp:long として記述する必要があります。このようにして、範囲を構成するキーを提供し、複合列のタイムスタンプ コンポーネントをスライスできます。

于 2012-12-04T15:20:48.130 に答える
1

非正規化!実行したいクエリのタイプを有効にする方法でスキーマをモデル化する必要があります。このようなシナリオでは、リバース (別名、インバーテッド、インバース) インデックスを作成します。

CREATE TABLE report(
    KEY uuid PRIMARY KEY,
    svc1 bigint,
    svc2 bigint,
    svc3 bigint
);

CREATE TABLE ReportsByTime(
    KEY ascii PRIMARY KEY
) with default_validation=uuid AND comparator=uuid;

CREATE TABLE ReportsByUser(
    KEY bigint PRIMARY KEY
)with default_validation=uuid AND comparator=uuid;

素敵な説明については、こちらを参照してください。現在行っていることは、テーブルに独自のasciiキーを生成してtimes、必要な範囲スライス クエリを実行asciiできるようにすることです。プログラムで独自のスライス キーを生成するために使用できるものである必要はありません。

このアプローチを使用して、すべてのクエリを容易にすることができます。これはアプリケーションに直接適合しない可能性がありますが、考え方は同じです。上記の各テーブルの列キーに意味のある値を追加することで、これをさらに絞り込むことができます。

cqlsh:tester> select * from report;
 KEY                                  | svc1 | svc2 | svc3
--------------------------------------+------+------+------
 1381b530-1dd2-11b2-0000-242d50cf1fb5 |  332 |  333 |  334
 13818e20-1dd2-11b2-0000-242d50cf1fb5 |  222 |  223 |  224
 13816710-1dd2-11b2-0000-242d50cf1fb5 |  112 |  113 |  114


cqlsh:tester> select * from times;
 KEY,1212051037 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 | 1381b530-1dd2-11b2-0000-242d50cf1fb5,1381b530-1dd2-11b2-0000-242d50cf1fb5
 KEY,1212051035 | 13816710-1dd2-11b2-0000-242d50cf1fb5,13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5
 KEY,1212051036 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5

cqlsh:tester> select * from users;
 KEY         | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5
-------------+--------------------------------------+--------------------------------------
 23123123231 | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5
于 2012-12-05T16:23:08.467 に答える
-1

Keyがタイムスタンプで列名がLong-Valueである幅の広い行を使用してみませんか。複数のキー(タイムスタンプ)をgetKeySliceに渡し、複数の列をwithColumnSliceに名前(id)で選択できます。

列の名前と値がわからないので、これが役立つと思います。列ファミリーの定義の詳細を教えてください。

于 2012-12-04T12:16:22.510 に答える