我正在调查Cassandra作为数据密集型应用程序的可能替代后备存储,我正在研究如何构建模式并使用CQL来执行我们今天使用MySQL执行的各种查询
我目前遇到的具体问题是:我需要在表格中插入100万行。但是,如果已经存在具有正确标识的行(即它已经在系统中,由散列标识),我想出于关系原因重用其id。但我只期望重叠,例如10,000个ID - 但当然它可能都是100万个。
假设我有一个这样的表:
create table records_by_hash(hash text primary key, id bigint);
用多兆字节逗号分隔列表中的所有哈希值发出select hash, id from records_by_hash where hash in (...)
是否足够?这是Cassandra的最佳方法吗?
我们在MySQL中这样做的方式是这样的:
create temporary table hashes(hash text);
-- file is actually JDBC OutputStream
load data infile '/dev/stdin' into table hashes -- csv format
select id, hash from records join hashes on records.hash = hashes.hash;
由于记录是在哈希上编入索引的,而查询数据现在是在MySQL中(不再是往返),因此这是相当快速和轻松的。 load data
非常快,而且只有三次合理的往返行程。
答案 0 :(得分:0)
在大多数情况下,使用in运算符并不是最好的主意,因为您在同一查询中遇到多个分区(位于随机节点上)。它很慢并且在当前协调器节点上投入了大量工作。那里有多兆字节列表并不是一个好主意。
在设置之前检查很少是好主意,因为它没有真正扩展。 cassandra也没有为你提供连接。根据您的需要,您必须拥有某种脚本,以便在执行插入操作之前检查所有这些内容。所以你需要检查和设置等。
另一种方法是使用spark。
事情是cassandra不介意哈希已经存在并且你在它上面插入一些新东西。但这不是你真正需要的东西,因为你想保留引用。一种可能的方法是使用轻量级事务,因此只有在行尚不存在时才可以使用IF NOT EXISTS来执行插入。使用IF NOT EXISTS会导致与内部使用Paxos相关的性能损失。
答案 1 :(得分:0)
在MySQL中, ID 通常是 AUTO_INCREMENT - 在Cassandra中没有这个并行。我不清楚你是否想要让cassandra创建ID或者让其他系统/ db为你创建它们。
另外需要注意的是MySQL INSERT INTO表(a,b,c)VALUES(1,2,3)ON DUPLICATE KEY UPDATE 与cassandra CQL INSERT ,即Cassandra CQL INSERT将更新记录(如果存在)。
您可能希望在Cassandra中以不同的方式为信息建模