2017-04-20 7 views
2

우리는 우리가이 행에 대한 세포의 대부분에 널 (null)을 삽입 한 600000 행> 우리 주위에있는 카산드라카산드라 널 세포! = 삭제 표시된 세포 수

cqlsh 5.0.1 | Cassandra 2.1.14.1272 | DSE 4.8.7 | CQL spec 3.2.1 

을 사용하고 있습니다. 우리는 어제, 오늘, 내일의 날짜와 함께 8000 행을 스캔하는 쿼리를 실행합니다.

Read 101 live and 997 tombstone cells [SharedPool-Worker-1] | 2017-04-20 11:05:02.901000 | 10.74.70.30 |   11297 

내가 카산드라에 삽입 널 (NULL)이 그 세포에 대한 삭제 표시를 만들 것을 알고 있지만 왜 난 단지 쿼리가 각 레코드 들고 8K 기록을 반환하는 경우에도 같은 몇 삭제 표시를 볼 수 있습니다 내가 추적을 사용할 때 그러나 나는 단지 찾기 여러 개의 NULL이 있습니까? 이것을 설명 할 수 있을까요? 이 레코드의 TTL은 기본적으로 30 일이므로 TTL로 인해이 8KB의 결과 집합에 삭제 표시를 사용할 수 없습니다.

CREATE TABLE transportation_events.events_for_load_ops_exceptions (
    exception_phase text, 
    exception_date text, 
    event_id timeuuid, 
    actual_delivery_ts timestamp, 
    actual_pickup_ts timestamp, 
    carrier_due_ts timestamp, 
    carrier_id text, 
    carrier_mode text, 
    carrier_pickup_ts timestamp, 
    dest_loc_banner_code text, 
    dest_loc_class_code int, 
    dest_loc_id int, 
    dest_loc_name text, 
    dest_loc_type text, 
    dest_time_zone text, 
    destination_city text, 
    destination_postal_code text, 
    destination_state text, 
    destination_street_addr text, 
    exception_type text, 
    late_reason_code text, 
    load_id text, 
    load_type text, 
    loc_time_zone text, 
    orig_loc_id int, 
    orig_loc_name text, 
    orig_loc_type text, 
    orig_time_zone text, 
    origin_city text, 
    origin_postal_code text, 
    origin_state text, 
    origin_street_addr text, 
    reason_code_category text, 
    reason_code_desc text, 
    scheduled_delivery_ts timestamp, 
    scheduled_pickup_ts timestamp, 
    status_reason_code text, 
    stop_loc_id int, 
    stop_loc_name text, 
    stop_loc_type text, 
    stop_seq_num int, 
    stop_type text, 
    triggered_by text, 
    PRIMARY KEY ((exception_phase, exception_date), event_id) 
) WITH CLUSTERING ORDER BY (event_id DESC) 

내가 널 (null)을 삽입 한 것입니다 CQL을 통해 볼 수 있습니다

import com.datastax.driver.mapping.Mapper; 

mapper.save(resultRecord); 

에 의해 카산드라에 저장하고 :

EDIT 1

내 스키마입니다.

쿼리 나는 아마도 압축이 삭제 표시의 대부분을 제거했습니다

select * from transportation_events.events_for_load_ops_exceptions where exception_phase='PLANNING' AND exception_date IN ('2017-04-19','2017-04-20','2017-04-21'); 

을 추적입니까? 다른 설명이 있습니까? EDIT 2 삭제 표시와 그 원인을 한꺼번에 요약하여 요약하여 볼 수있는 방법이 있다면? 테이블을위한 묘비 덤프처럼?

+0

테이블의 스키마는 무엇입니까? – DineMartine

+0

그리고 정확히 어떻게 NULL 값을 삽입 했습니까? 지금까지 Cassandra는 "unset"매개 변수와 NULL 매개 변수를 구별 할 수 없기 때문에 준비된 명령문을 사용할 때 NULL이 결과로 표시됩니다. C * 버전 <= 2.2.0은 insert 문에 힌트를 제공하여 C *에게 [NULL을 설정하지 않음] (https://issues.apache.org/jira/browse/CASSANDRA-7304)을 처리하도록 알려줍니다. – Ralf

+0

dse API의 mapper.save를 사용하면 자동으로 NULL이 삽입됩니다. 나는 CQLSH를 사용하여 행을 쿼리 할 때 NULL을 볼 수 있습니다. – Tanvi

답변

2

NULL을 값으로 삽입 할 수 있으므로 삭제 표시가 생성되지 않습니다.

사용중인 드라이버에 따라 null과 nulls를 값으로 삽입하는 것의 차이점을 검토하십시오.

또 다른 옵션으로 각 값에 대해 하나의 묘비 대신 홀 행 또는 파티션에 대해 하나의 묘비를 사용할 수 있습니다.

+0

마지막 줄을 자세히 설명해 주시겠습니까? 또한 NULL이 아닌 경우 TTL이 30 일이고 데이터 가치가있는 3 일만 쿼리하면 이러한 삭제 표시를 설명 할 수있는 항목은 무엇입니까? 나는 차이점이 있다는 것을 몰랐다. NULL을 삽입하고 NULL을 값으로 삽입하는 것? – Tanvi

+0

예를 들어 python 드라이버에서 준비된 명령문에 null을 삽입하면 값으로 간주되어 삭제 표시가 만들어지지 않습니다. 다음 작업을 수행하는 것이 가장 쉬운 방법입니다. 1) null insert를 수행하십시오. 2) 세척.3) 최신 테이블의 sstable 덤프를보고 삭제 표시를 참조하십시오. – nevsv

+0

NULL을 생성하는 것이 확실합니다. y에 따라 기본값이 NULL 인 삭제 표시가있는 DSE 매퍼를 사용하고 있습니다. 하지만 제 질문은 비석의 수에 차이가있는 이유는 무엇입니까? 1 행에 5 개의 nULL이있는 경우 5 개의 삭제 표시가 예상됩니다. 그러나 숫자는 여기서 일치하지 않습니다. – Tanvi