0

列ファミリーの異なる行の列数をカウントするにはどうすればよいですか?

私はカサンドラの初心者です。出発点がわからない。私が持っている唯一のオプションは、一度に各行のデータをアプリケーションにフェッチさせることです。私には正しく聞こえません。私は Hector を使用して Cassandra に接続しています。

4

2 に答える 2

0

幅の広い行があると仮定します(CLIを使用して作成しましょう)

create column family cf3 
 with column_type = 'Standard' and 
 comparator = 'TimeUUIDType' and 
 key_validation_class = 'UTF8Type' and 
 default_validation_class = 'UTF8Type';

これは私がCQL3で見ているものです:

cqlsh:ks> desc table cf3;

CREATE TABLE cf3 (
  key text,
  column1 timeuuid,
  value text,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

CQL3 からいくつかの値を挿入しました。これにより、古き良き MySQL のように感じることができます。

cqlsh:ks> insert into cf3 (key, column1, value) values ('user1', now(), 'time5');
cqlsh:ks> select * from cf3;

 key   | column1                              | value
-------+--------------------------------------+-------
 user1 | f0c687b0-d114-11e2-8002-2f4261da0d90 | time1
 user1 | fb9fa130-d114-11e2-8002-2f4261da0d90 | time2
 user1 | 09512f10-d115-11e2-8002-2f4261da0d90 | time3
 user1 | 0f5c93e0-d115-11e2-8002-2f4261da0d90 | time4
 user1 | 21155220-d115-11e2-8002-2f4261da0d90 | time5

しかし、それはあなたの広い行です(CLIから見たように)

[default@ks] list cf3;
Using default limit of 100
Using default column limit of 100
-------------------
RowKey: user1
=> (column=f0c687b0-d114-11e2-8002-2f4261da0d90, value=time1, timestamp=1370789864363000)
=> (column=fb9fa130-d114-11e2-8002-2f4261da0d90, value=time2, timestamp=1370789882563000)
=> (column=09512f10-d115-11e2-8002-2f4261da0d90, value=time3, timestamp=1370789905537000)
=> (column=0f5c93e0-d115-11e2-8002-2f4261da0d90, value=time4, timestamp=1370789915678000)
=> (column=21155220-d115-11e2-8002-2f4261da0d90, value=time5, timestamp=1370789945410000)

1 Row Returned.
Elapsed time: 105 msec(s).

ここで、特定の時間以降の列の数を数えたいと考えました。右?これがそのためのCQL3です。

cqlsh:ks> select count(*) from cf3 where key = 'user1' and column1 >= 09512f10-d115-11e2-8002-2f4261da0d90 ;

 count
-------
     3

今、私は何が下にあるのか少し疑わしいです. しかし、私の直感によると、実際にはすべての列がコーディネーター ノードでフェッチされ、メモリ内でカウントされます。これはおそらく、クライアント マシンで手動で計画していたものと多少似ています。

また、cassandra-cli がそのような機能を提供するかどうかはわかりませんが、Hector を使用しているとのことでした。したがって、ここで説明したように、範囲の終わりと大きなカウント値を持つことを除いてget_countCountQueryを活用することができます。このような:null

CountQuery<String, String> cq = HFactory.createCountQuery(keyspace, StringSerializer.get(), TimeUUIDSerializer.get());
cq.setColumnFamily(cf).setKey("user1");
cq.setRange(timestamp, null, Integer.MAX_VALUE);
QueryResult<Integer> r = cq.execute();

(上記のコンパイルされていないコード)

HTH


古い答え:

ヘクターのドキュメントを参照してください:

CQL:

CqlQuery<String,String,Long> cqlQuery = new CqlQuery<String,String,Long>(keyspace, se, se, le);
cqlQuery.setQuery("SELECT COUNT(*) FROM StandardLong1 WHERE KEY = 'cqlQueryTest_key1'");
QueryResult<CqlRows<String,String,Long>> result = cqlQuery.execute();
assertEquals(2, result.get().getAsCount());

条件を見逃して、目的を解決するために使用する場合があります。WHERELIMIT

于 2013-06-09T12:35:48.803 に答える