2016-12-05 172 views
1

從大表選擇我的表像這樣卡桑德拉(2.1.15.1423),擁有超過14次億的記錄:緩慢卡桑德拉

CREATE TABLE keyspace.table (
    field1 text, 
    field2 text, 
    field3 text, 
    field4 uuid, 
    field5 map<text, text>, 
    field6 list<text>, 
    field7 text, 
    field8 list<text>, 
    field9 list<text>, 
    field10 text, 
    field11 list<text>, 
    field12 text, 
    field13 text, 
    field14 text, 
    field15 list<frozen<user_defined_type>>, 
    field16 text, 
    field17 text, 
    field18 text, 
    field19 text, 
    PRIMARY KEY ((field1, field2, field3) field4) 
) WITH bloom_filter_fp_chance = 0.01 
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
    AND comment = '' 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'} 
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99.0PERCENTILE'; 

在實際應用中我使用Python(Cassandra的驅動程序== 3.1。 1)和Go(gocql)。

問題:

我需要將此表中的記錄移到另一個表中。 當我試圖獲取數據(即使沒有過濾器)都停下來,我得到超時錯誤。 我試圖改變fetch_size/page_size - 結果相同,但等待幾分鐘後。

+0

你能分享您在驅動程序中使用,從這個表中拉回來的數據的代碼? – markc

回答

3

如果您要將此表中的記錄移動到其他表中,您應該一次執行一個分區範圍。做類似

SELECT * FROM keyspace.table 

將無法​​在高度分散的數據存儲區(如Cassandra)中工作。這是因爲像上面那樣的查詢需要執行完整的羣集掃描和分散/收集操作才能滿足它。這是C *中的反模式,在大多數情況下會導致超時。更好的方法是一次只查詢一個分區。數據存儲可以快速檢索這些數據。這種操作的一種常見模式是逐個遍歷表中的令牌範圍,並單獨處理每個令牌範圍。下面是一個示例(對不起,這是Java中的),您可以如何將Cassandra中的令牌範圍分割爲只有與數據的一小部分在同一時間處理:

https://github.com/brianmhess/cassandra-count

+0

謝謝,但我有同樣的要求。 –

+0

我也嘗試獲取for循環中的數據,指定PK的最後部分,但是這適用於具有少於10k條記錄的分區( –

+0

)您指的是「指定PK的最後部分」,因爲您必須指定整個Partition Key in any select statement? – bechbd