代码之家  ›  专栏  ›  技术社区  ›  Xavier Prudent

使用Cassandra加载程序加载csv时,Cassandra缺少数据

  •  0
  • Xavier Prudent  · 技术社区  · 6 年前

    我在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);
    

    我将一个50000行的小数据集上载到此表

    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
    

    使用卡桑德拉装载机 https://github.com/brianmhess/cassandra-loader

    我可以使用CQL副本,但这是进一步加载的初步测试,我将需要卡桑德拉加载程序。

    我加载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 回复  |  直到 6 年前
        1
  •  1
  •   Horia    6 年前

    表的主键是numligne,date。

    由于csv文件中的数据对于同一个主键来说是不唯一的,即使您插入了,cassandra也只更新这些条目。

    为了给你一个例子,如果在第43行你有组合332017-12-07,…这将被插入。如果在第2000行有相同的组合,那么当这个插入操作运行时,Cassandra实际上会执行一个更新,因为这个键已经在数据库中了。

    插入和更新操作都是 upsert 操作。进一步了解 INSERT UPDATE 命令。

    为了避免这一点,你可以定义另一个主键,所以每一行都有一个唯一的键,或者你可以编写自己的加载器,如果不存在的话,它会插入,所以只有当它们不存在时才插入行(见插入命令的链接,只有当它不存在时才插入行)。

    卡桑德拉自己提供 COPY 命令,但是

    该过程验证主键并更新现有记录。

    在检查了您正在使用的工具的代码之后,我可以看到 INSERT command being used 如果不存在,则不使用,因此,如果密钥已经存在,它也将更新。