2

私が持っているとしましょう:

cur.execute("CREATE TABLE data_by_year ( device_id int, \
        site_id text, year_id int, event_time timestamp, value float, \
        PRIMARY KEY ((device_id, site_id, year_id),event_time))")

そして、2014 年と 2013 年のすべてのデバイスを照会したいと考えています。

result=cur.execute("select distinct device_id, site_id, year_id,\
    from data_by_year where device_id IN (324535, 32453l),\
    and site_id in  and year_id IN (2014)")

明らかに、このステートメントには多くの問題がありますが、これは私が思いつく最良の例です。私の牛肉は「where device_id IN (324535, 32453l)」にあります。実際にはいろいろなデバイスをすべて知っているわけではないので、「ALL」をつかみたいと思います。どうすればいいですか?

時系列の分単位のデータを扱っているので、1年という区切りは妥当だと感じました。

4

2 に答える 2

2

knifewine の答えは正しいですが、このクエリを頻繁に実行する (そしてパフォーマンスを向上させたい) 場合は、2 番目のテーブルを使用することをお勧めします。

CREATE TABLE all_device_data_by_year (
    site_id text,
    year_id int,
    device_id int,
    event_time timestamp,
    value float,
    PRIMARY KEY ((site_id, year_id), device_id, event_time)
)

デバイスの数によっては、年ではなく日/月で分割することをお勧めします。

Python ドライバーでの自動クエリ ページング サポートに関しては、現在 2.0 ブランチで利用できます。すぐに 2.0 ベータ版のリリースを準備する必要があります。

于 2014-04-11T00:14:52.513 に答える
1

ALLOW FILTERING を使用してすべてを取得できますが、すべてのノードが応答する必要があるため、パフォーマンスの面でコストがかかることに注意してください。

select distinct device_id, site_id, year_id from data_by_year ALLOW FILTERING;

limit 句を含めることでパフォーマンスの問題を少し軽減できますが、これではすべてのデータをページングすることはできません。ページングが必要な場合は、ページング機能を備えた datastax Java ドライバーを使用することをお勧めします (または、ページングが datastax python ドライバーに到達するのを待ちます)。

上記のいずれもユースケースでうまくいかない場合は、テーブルを再設計する方が良いオプションになる可能性があります (セカンダリ インデックスを使用することもできますが、パフォーマンスが低下する可能性もあります)。

于 2014-04-10T22:15:40.187 に答える