我在Ubuntu 16.04上的两个节点上使用Cassandra 3.11.3。 我将在这里使用的键空间和表是:
## Create a keyspace
CREATE KEYSPACE sto
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
} ;
## Create a table
CREATE TABLE sto.cartespuce_numligne_date (
numcarteserie text,
codetypetitre int,
typetransaction int,
heuretransaction float,
numservice int,
numligne text,
direction text,
heureligne float,
numjour text,
numarret text,
numbus int,
date date,
PRIMARY KEY (numligne, date)
) WITH CLUSTERING ORDER BY (date DESC);
我将一张包含50,000行的小型数据集上载到该表
numligne,date,codetypetitre,direction,heureligne,heuretransaction,numarret,numbus,numcarteserie,numjour,numservice,typetransaction
33,2017-12-07,144,Nord,13.88,15.27,2190,808,1229320749340288,1,268,2
749,2017-12-08,144,Nord,6.93,7.35,1459,507,1229320749340288,1,548,1
使用cassandra-loader https://github.com/brianmhess/cassandra-loader
我可以使用CQL副本,但这是进一步测试的初步测试,需要使用cassandra-loader。
我加载了csv文件data.csv:
cassandra-loader -f data.csv -host my-ip-address -schema "sto.cartespuce_numligne_date(numligne,date,codetypetitre,direction,heureligne,heuretransaction,numarret,numbus,numcarteserie,numjour,numservice,typetransaction)"
处理顺利进行,并以以下日志结尾:
*** DONE: data.csv number of lines processed: 50000 (50000 inserted)
但是当我用CQL计算行数时:
cqlsh> SELECT COUNT(*) FROM sto.cartespuce_numligne_date;
count
-------
9877
比较特殊情况,很显然数据库中缺少数据。我发现存储的数据和丢失的数据没有区别。
如何释放80%的数据?
答案 0 :(得分:1)
表的主键是numligne,日期。
由于根据相同的主键,csv文件中的数据不是唯一的,因此即使您进行插入,cassandra也只会更新这些条目。
举个例子,如果在第43行您有组合33,2017-12-07,...将被插入。如果在2000行中您具有相同的组合,则在运行此插入操作时,Cassandra实际上将进行更新,因为该键已经在数据库中。
INSERT和UPDATE操作都是upsert操作。进一步了解INSERT和UPDATE命令。
为避免这种情况,您可以定义另一个主键,以便每行都有一个唯一键,或者您可以编写自己的加载程序,该加载程序将使用IF NOT EXISTS插入,因此仅在行不存在时才插入行(请参见INSERT命令的链接,段落仅在不存在的情况下插入行。
Cassandra提供了自己的COPY命令,但是
该过程将验证PRIMARY KEY并更新现有记录。
在检查了所用工具的代码之后,我发现INSERT command being used没有使用IF NOT EXISTS,因此如果密钥已经存在,它也会更新。