0

時系列データを少数の非常に「広い」行に格納するために、Cassandra に次の列ファミリがあります。

CREATE TABLE data_bucket (
  day_of_year int,
  minute_of_day int,
  event_id int,
  data ascii,
  PRIMARY KEY (data_of_year, minute_of_day, event_id)
)

CQL シェルでは、次のようなクエリを実行できます。

select * from data_bucket where day_of_year = 266 and minute_of_day = 244 
  and event_id in (4, 7, 11, 1990, 3433)

基本的に、複合列名 (minute_of_day) の最初のコンポーネントの値を修正し、2 番目のコンポーネント (event_id) の個別の値に基づいて連続していない一連の列を選択したいと考えています。「IN」関係は等価関係として解釈されるため、これはうまく機能します。

ここで私の質問は、CQL を使用せずに、同じタイプの複合列スライシングをプログラムでどのように達成するかということです。これまでのところ、Python クライアント pycassa と Java クライアント Astyanax を試しましたが、成功しませんでした。

どんな考えでも大歓迎です。

編集:

cassandra-cli から見た列ファミリーの記述出力を追加しています。Thrift ベースのソリューションを探しているので、これが役立つかもしれません。

ColumnFamily: data_bucket
  Key Validation Class: org.apache.cassandra.db.marshal.Int32Type
  Default column value validator: org.apache.cassandra.db.marshal.AsciiType
  Cells sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.Int32Type)
  GC grace seconds: 864000
  Compaction min/max thresholds: 4/32
  Read repair chance: 0.1
  DC Local Read repair chance: 0.0
  Populate IO Cache on flush: false
  Replicate on write: true
  Caching: KEYS_ONLY
  Bloom Filter FP chance: default
  Built indexes: []
  Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
  Compression Options:
    sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor
4

1 に答える 1

1

Thrift API には「IN」タイプのクエリはありません。get各複合列値 ( day_of_yearminute_of_day、 ) に対して一連のクエリを実行できますevent_id

あなたevent_idの s がシーケンシャルだった場合 (そしてあなたの質問はそうではないと言っています)、単一のクエリを実行して、範囲 (たとえば 、 、および s の範囲get_slice) を渡すことができます。この方法でそれらの束を取得し、応答をプログラムで自分でフィルター処理できます (たとえば、イベント ID が 4 ~ 3433 の日付のすべてのデータを取得します)。より多くのデータ転送、クライアント側での処理が増えるため、実際に範囲を探している場合を除き、優れたオプションではありません.day_of_yearminute_of_dayevent_id

そのため、Cassandra で「IN」を使用する場合は、CQL ベースのソリューションに切り替える必要があります。Python で CQL を使用することを検討している場合、別のオプションはcassandra-dbapi2です。これは私のために働いた:

import cql

# Replace settings as appropriate
host = 'localhost'
port = 9160
keyspace = 'keyspace_name'

# Connect
connection = cql.connect(host, port, keyspace, cql_version='3.0.1')
cursor = connection.cursor()
print "connected!"

# Execute CQL
cursor.execute("select * from data_bucket where day_of_year = 266 and minute_of_day = 244 and event_id in (4, 7, 11, 1990, 3433)")
for row in cursor:
  print str(row) # Do something with your data

# Shut the connection
cursor.close()
connection.close()

(Cassandra 2.0.1 でテスト済み)

于 2013-09-24T22:15:17.387 に答える