Cassandra - ไม่สามารถลบแถว

Aug 22 2020

ฉันต้องการลบหนึ่งแถวจากตาราง Casandra แต่ทำไม่ได้ ฉันสามารถลบรายการอื่น ๆ ออกจากตารางได้ยกเว้นสิ่งนี้ ฉันใส่ข้อความค้นหาที่ผิดพลาด แต่ไม่มีอะไรเกิดขึ้น:

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>

นี่คือ shema ของตารางนี้:

    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';

ข้อเสนอแนะใด ๆ ?

คำตอบ

3 NadavHar'El Aug 22 2020 at 18:36

สถานการณ์ที่แปลกประหลาดนี้อาจเกิดขึ้นได้หากแถวนั้นถูกสร้างขึ้นด้วยเวลาที่ตั้งไว้ในอนาคต ใน Cassandra และ Scylla ลูกค้าสามารถระบุการประทับเวลาสำหรับการเขียนแต่ละครั้งและการประทับเวลาล่าสุดจะชนะโดยไม่คำนึงถึงลำดับเวลาของการอัปเดตตามเวลาจริง

ตัวอย่างเช่นพิจารณาว่าไคลเอนต์รายหนึ่งเขียนแถวด้วยการประทับเวลา 1,000 และบางครั้งหลังจากนั้นไคลเอนต์อื่นจะส่งการลบที่ประทับเวลา 900 การลบนั้นจะไม่ลบอะไรเลย - ถือว่าการเขียนเกิดขึ้นหลังจากการลบดังนั้นการลบจะถูกละเว้น

เป็นไปได้ว่านี่คือสิ่งที่เกิดขึ้นกับคุณ: ลูกค้าที่มีนาฬิกากำหนดค่าไม่ถูกต้องใช้นาฬิกานี้และสร้างแถวที่มีการประทับเวลาในอนาคต เมื่อคุณลองdelete from sales.tbl where orderid=999999 and orderdate='2019/01/01';ใช้เวลาปัจจุบันเป็นเวลาประทับของการลบนี้และเก่ากว่าการประทับเวลาในอนาคตดังนั้นการลบจะถูกละเว้น

หากต้องการตรวจสอบว่าเป็นกรณีนี้หรือไม่ให้ลอง

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

ซึ่งจะแสดงเวลาทำงาน (เช่นการประทับเวลา) ของคอลัมน์ "ภูมิภาค" (เช่น) ในรายการของคุณ เวลานี้เป็นหน่วยไมโครวินาทีนับตั้งแต่ยุค UNIX (เที่ยงคืน GMT วันที่ 1 มกราคม 1970) หากเป็นในอนาคตแสดงว่าฉันเดาปัญหาของคุณได้ถูกต้อง หากเป็นกรณีนี้หากต้องการลบแถวนี้จริงๆคุณจะต้องทำสิ่งต่างๆเช่น

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

โดยที่เวลาประทับ "111111111" คือตัวเลข (อย่างน้อย) หนึ่งตัวที่สูงกว่าการประทับเวลาที่selectแสดงให้คุณเห็น