Cassandra - não é possível deletar linha

Aug 22 2020

Eu gostaria de excluir uma linha específica da tabela Casandra, mas não posso. Consigo deletar qualquer outro da mesa, exceto este. Coloquei a consulta de exclusão seguinte, mas nada aconteceu:

cqlsh> delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';
cqlsh>
cqlsh> select * from sales.tbl where orderid=999999 and orderdate='2019/01/01';

 orderid | orderdate  | country | itemtype | orderpriority | region        | saleschannel | shipdate   | totalcost | totalprofit | totalrevenue | unitcost | unitprice | unitssold
---------+------------+---------+----------+---------------+---------------+--------------+------------+-----------+-------------+--------------+----------+-----------+-----------
  999999 | 2019/01/01 |  Canada |    Stuff |             N | North America |      Offline | 2019/01/02 |       100 |           0 |          100 |        0 |         1 |         1

(1 rows)
cqlsh>

Aqui está o shema desta mesa:

    CREATE TABLE sales.tbl1 (
        orderid bigint,
        orderdate text,
        country text,
        itemtype text,
        orderpriority text,
        region text,
        saleschannel text,
        shipdate text,
        totalcost float,
        totalprofit float,
        totalrevenue float,
        unitcost float,
        unitprice float,
        unitssold int,
        PRIMARY KEY (orderid, orderdate) ) WITH CLUSTERING ORDER BY (orderdate ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
        AND comment = ''
        AND compaction = {'class': 'SizeTieredCompactionStrategy'}
        AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND crc_check_chance = 1.0
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 1
        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';

alguma sugestão?

Respostas

3 NadavHar'El Aug 22 2020 at 18:36

Essa situação bizarra pode acontecer se a linha foi criada com um horário distante no futuro. No Cassandra e no Scylla, os clientes podem especificar um carimbo de data / hora para cada gravação e o carimbo de data / hora mais recente vence - independentemente da ordem das atualizações em tempo real.

Por exemplo, considere que um cliente grava uma linha com carimbo de data / hora 1000 e, algum tempo depois, outro cliente envia uma exclusão no carimbo de data / hora 900. Essa exclusão não excluirá nada - a gravação é considerada como tendo ocorrido após a exclusão, então a exclusão é simplesmente ignorada.

É possível que isso seja exatamente o que aconteceu com você: Um cliente com um relógio mal configurado usou esse relógio e criou uma linha com um carimbo de data / hora em um futuro distante. Quando você tenta agora, delete from sales.tbl where orderid=999999 and orderdate='2019/01/01';a hora atual é usada como o carimbo de data / hora desta exclusão, e é mais antigo do que o carimbo de data / hora futuro, então a exclusão é simplesmente ignorada.

Para verificar se este é o caso, tente

select writetime(region) from sales.tbl where orderid=999999 and orderdate='2019/01/01';

Isso mostrará o tempo de gravação (ou seja, carimbo de data / hora) da coluna "região" (por exemplo) em seu item. Este tempo é em microssegundos desde a época do UNIX (meia-noite GMT, 1º de janeiro de 1970). Se for no futuro, adivinhei corretamente o seu problema. Se for esse o caso, para realmente excluir esta linha, você precisará fazer algo como

delete from sales.tbl using timestamp 111111111 where orderid=999999 and orderdate='2019/01/01';

Onde o carimbo de data / hora "111111111" é um número (pelo menos) um maior do que o carimbo de data / hora que selectmostrou a você.