2016-12-05 175 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