使用cassandra-loader加载csv时,cassandra缺少数据

时间:2018-08-09 20:36:42

标签: cassandra

我在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%的数据?

1 个答案:

答案 0 :(得分:1)

表的主键是numligne,日期。

由于根据相同的主键,csv文件中的数据不是唯一的,因此即使您进行插入,cassandra也只会更新这些条目。

举个例子,如果在第43行您有组合33,2017-12-07,...将被插入。如果在2000行中您具有相同的组合,则在运行此插入操作时,Cassandra实际上将进行更新,因为该键已经在数据库中。

INSERT和UPDATE操作都是upsert操作。进一步了解INSERTUPDATE命令。

为避免这种情况,您可以定义另一个主键,以便每行都有一个唯一键,或者您可以编写自己的加载程序,该加载程序将使用IF NOT EXISTS插入,因此仅在行不存在时才插入行(请参见INSERT命令的链接,段落仅在不存在的情况下插入行。

Cassandra提供了自己的COPY命令,但是

  

该过程将验证PRIMARY KEY并更新现有记录。

在检查了所用工具的代码之后,我发现INSERT command being used没有使用IF NOT EXISTS,因此如果密钥已经存在,它也会更新。