Cassandra が推奨する RandomPartitioner (または Murmur3Partitioner)を使用する場合、キーの md5 ハッシュを使用して行がクラスター全体に分散されるため、キーに対して意味のある範囲クエリを実行することはできません。これらのハッシュは「トークン」と呼ばれます。
それにもかかわらず、それぞれにトークンの範囲を割り当てることによって、多くのコンピューティング ワーカー間で大きなテーブルを分割することは非常に便利です。CQL3 を使用すると、トークンに対して直接クエリを発行できるように見えますが、次の pythonは機能しません... 編集: cassandra データベースの最新バージョンに対するテストに切り替えた後に機能し (doh!)、構文も更新します以下のメモ:
## use python cql module
import cql
## If running against an old version of Cassandra, this raises:
## TApplicationException: Invalid method name: 'set_cql_version'
conn = cql.connect('localhost', cql_version='3.0.2')
cursor = conn.cursor()
try:
## remove the previous attempt to make this work
cursor.execute('DROP KEYSPACE test;')
except Exception, exc:
print exc
## make a keyspace and a simple table
cursor.execute("CREATE KEYSPACE test WITH strategy_class = 'SimpleStrategy' AND strategy_options:replication_factor = 1;")
cursor.execute("USE test;")
cursor.execute('CREATE TABLE data (k int PRIMARY KEY, v varchar);')
## put some data in the table -- must use single quotes around literals, not double quotes
cursor.execute("INSERT INTO data (k, v) VALUES (0, 'a');")
cursor.execute("INSERT INTO data (k, v) VALUES (1, 'b');")
cursor.execute("INSERT INTO data (k, v) VALUES (2, 'c');")
cursor.execute("INSERT INTO data (k, v) VALUES (3, 'd');")
## split up the full range of tokens.
## Suppose there are 2**k workers:
k = 3 # --> eight workers
token_sub_range = 2**(127 - k)
worker_num = 2 # for example
start_token = worker_num * token_sub_range
end_token = (1 + worker_num) * token_sub_range
## put single quotes around the token strings
cql3_command = "SELECT k, v FROM data WHERE token(k) >= '%d' AND token(k) < '%d';" % (start_token, end_token)
print cql3_command
## this fails with "ProgrammingError: Bad Request: line 1:28 no viable alternative at input 'token'"
cursor.execute(cql3_command)
for row in cursor:
print row
cursor.close()
conn.close()
私はよりpythonicなインターフェースを好むので、理想的にはこれをpycassaで動作させたいと思っています。
これを行うより良い方法はありますか?