2016-10-01 1 views
3

나는 sensordata가있는 카산드라 3.7에 테이블/칼럼을 가지고 있습니다.카산드라의 동일한 기본 키에 대한 중복 행/열

CREATE TABLE test.sensor_data (
    house_id int, 
    sensor_id int, 
    time_bucket int, 
    sensor_time timestamp, 
    sensor_reading map<int, float>, 
    PRIMARY KEY ((house_id, sensor_id, time_bucket), sensor_time) 
) 

이제이 표에서 선택할 때 동일한 기본 키에 대해 복제본을 찾았습니다. 불가능하다고 생각했던 것입니다.

cqlsh:test> select * from sensor_data; 

house_id | sensor_id | time_bucket | sensor_time      | sensor_reading 
----------+-----------+-------------+---------------------------------+---------------- 
     1 |   2 |   3 | 2016-01-02 03:04:05.000000+0000 |  {1: 101} 
     1 |   2 |   3 | 2016-01-02 03:04:05.000000+0000 |  {1: 101} 

나는 문제의 일부는이 데이터가 모두 자바와 Datastax 자바 드라이버를 사용하여 "라이브"에 기록 된 것을 생각하고는 sstableloader을 사용하여 다른 소스에서 역사적인 데이터와 함께로드되었습니다.

이 방법은 가능하지 않습니다. 나는이 클러스터에 기존의 cassandra-cli를 연결할 방법이 없다. 아마도 cqlsh를 사용하여 볼 수없는 것을 말해 줬을 것이다.

따라서 질문은 다음과 같습니다.
* 알려진 상황에서이 문제가 발생할 수 있습니까?
* cqlsh를 사용하여 더 많은 원시 데이터를 읽을 수 있습니까? 특히이 두 행의 시간을 기록하십시오. writetime() - 함수는 기본 키 또는 컬렉션에서 작동 할 수 없으며 그게 전부입니다.

감사합니다.

업데이트 :

이 내가 댓글, 답변 및 기타 소스에서 시도한 것입니다
* 선택 후, blobAsBigInt는 카산드라 - CLI 사용하여 연결 모두 동일한 행
*에 대해 같은 큰 정수를 제공하여 근검을 가능하게하는 것은 가능하지만 테이블을 읽는 것은 불가능합니다. 3.x 이후에는 지원되지 않습니다.
* sstabledump를 사용하여 덤프가 진행되지만 1 주일에서 2 주 정도 걸릴 것으로 예상됩니다.)

+0

당신이 ...를 확인하실 수 있습니다 재생 관리 카산드라 -cli 데이터? – Nick

+0

아니요, 3.x에서는 cassandra-cli가 지원되지 않습니다. 내가 sstabledump 할 수 있지만 데이터 파일이 거대하고 그 도구는 필터링을 제공합니다. –

+0

sensor_time은 두 행에서 모두 다르지만 시간이 같은 것처럼 잘리고 표시됩니다. Cassandra 메일 링리스트에도 물어볼 수 있습니다. – Nick

답변

-1

"sensor_time"은 기본 키의 일부입니다. "Partition Key"에 없지만 "Clustering Column"입니다. 이것이 왜 두 개의 "행"을 얻는가입니다.

그러나 디스크 테이블에서 "시각적 행"은 모두 단일 카산드라 행에 저장됩니다. 사실 그들은 단지 다른 열이며 CQL은 단지 두 개의 "시각적 행"이라고 가장합니다.

명확화 - 나는 잠시 동안 카산드라와 일하지 않았기 때문에 올바른 용어를 사용하지 않을 수도 있습니다. "시각적 행"이라고 할 때 CQL 결과가 나타내는 것을 의미합니다.

업데이트

당신은 다음과 같은 실험을 만들 수 있습니다 (무시하고 내가 할 것입니다 구문 오류를 수정하십시오).

이 복합 기본 키 테이블을 수행한다고 가정

  • "상태"는 "파티션 키"와
  • "도시"는 "클러스터링 열"입니다.

    은 테이블 도시 ( 상태 INT, 도시 INT, 이름 텍스트, 기본 키 ((주), 도시) )을 생성;

    도시 (주, 도시, 이름) 값 (1, 1, 'New York')에 삽입; 도시 (주, 도시, 이름) 값 (1, 2, 'Corona')에 삽입;

    select * 도시에서 state = 1;

    1, 1, New York 
    1, 2, Corona 
    

    그러나 디스크에 문제는이 같은 단일 행에 저장됩니다 :

이 같은를 반환합니다

당신은 당신이 할 수있는 등 복합 기본 키가
+-------+-----------------+-----------------+ 
| state | city = 1  | city = 2  | 
|  +-----------------+-----------------+ 
|  | city | name  | city | name  | 
+-------+------+----------+------+----------+ 
| 1  | 1 | New York | 2 | Corona | 
+-------+------+----------+------+----------+ 

그것을 선택하거나 삭제하십시오. 질문에

select * from cities where state = 1; 
delete from cities where state = 1; 

, 기본 키는 다음과 같이 정의된다 :

PRIMARY KEY ((house_id, sensor_id, time_bucket), sensor_time) 

이것이 의미하는

  • "house_id", "sensor_id", "time_bucket"는 "파티션 키"와
  • 입니다
  • "sensor_time"은 "클러스터링 열"입니다.

그래서 선택하면 실제 행이 나눠지고 여러 행이있는 것처럼 보입니다.

기본 키 정의가 두 부분으로 구성되어

http://www.planetcassandra.org/blog/primary-keys-in-cql/

업데이트 : 키와 클러스터링 열 파티션. 첫 번째 부분은 저장소 엔진 행 키에 매핑되고 두 번째 부분은 행의 열을 그룹화하는 데 사용됩니다. 스토리지 엔진에서 클러스터링 열의 값 앞에 이라는 접두사를 붙여 열을 그룹화합니다. Thrift API를 사용할 때 이것은 표준 디자인 패턴 입니다. 그러나 이제 CQL은 클러스터링 열 값을 테이블의 비 키 필드와 중계하는 작업을 처리합니다.

"The Composite Enchilada"의 설명을 읽으십시오.

+0

적어도 3.x 이후에는 이것이 사실이라고 생각하지 않습니다. 저장 방법에 관계없이 전체 기본 키가 동일하면 읽혀질 때 필터링해야합니다. –

+0

datastax 웹 사이트 어딘가에 대한 설명이 있었지만 찾을 수 없습니다. 당신이 할 수있는 실험으로 편집 할 것입니다. – Nick

0

타임 스탬프 입력란에 나노초가 표시 될 것으로 기대하지 않으며, 완전히 지원되지 않는다고 생각합니다.이 시도 :

SELECT house_id, sensor_id, time_bucket, blobAsBigint(sensor_time) FROM test.sensor_data;

나는 정수를 통해 행을 삽입하여 일을 복제 할 수 있었다 : 나는를 사용하여 드라이버 중 하나를 의심 때문에

INSERT INTO sensor_data(house_id, sensor_id, time_bucket, sensor_time) VALUES (1,2,4,1451692800000); INSERT INTO sensor_data(house_id, sensor_id, time_bucket, sensor_time) VALUES (1,2,4,1451692800001);

이 말이 bigint는 타임 스탬프를 삽입하고, 실제로는 datetime을 사용합니다.

시간대이 재현 bigints 모두 재생 시도 ... 단지 BIGINT가 house_id | sensor_id | time_bucket | sensor_time | sensor_reading ----------+-----------+-------------+--------------------------+---------------- 1 | 2 | 3 | 2016-01-02 00:00:00+0000 | null 1 | 2 | 4 | 2016-01-01 23:00:00+0000 | null 1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null 1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null 1 | 2 | 4 | 2016-01-02 01:01:00+0000 | null 가 편집 재현 할처럼 보인다 날짜 삽입의 BIGINT의 올바른 위치를 사용하여 일부 헛소리를 시도,

+0

당신이하는 것처럼 정수로 삽입하면 두 줄도 얻을 수 있지만, 보통은'blobAsBigInt'와 함께 다른 값이 출력됩니다. 이 큰 클러스터에 대해 실행할 때 나는 모든 3 행에 대해 'blobAsBigInt'에 대해 동일한 값을 얻습니다. –

+0

@Andreas 글쎄, 나는 그때 손실을 느낀다. 내가 아는 카산드라에 대해 당신이 가진 것이 가능해서는 안됩니다. 당신의 수사가 보여주는 것을 알고 싶습니다. 둘째로 두 개 이상의 노드를 쿼리하고 있습니까? test.sensor_data를 설명하는 결과는 무엇입니까? – Highstead

+0

'tracing on'에서 하나의 노드 만 조회한다는 것을 알 수 있습니다. 다른 노드를 querering하거나'consistency all '을 추가하면 같은 결과가 나오므로이 "error"는 데이터를 보유한 모든 노드에 있습니다. –