문제

다음과 유사한 Cassandra 스키마가 있습니다.

CREATE TABLE table1 (a1 text,
  a2 text,
  b1 text,
  b2 text,
  c1 text,
  c2 text,
  PRIMARY KEY ( (a1, a2), b1, b2) )
);

시계열 데이터용입니다.a1은 내 ID이고 a2는 내 시간 버킷입니다.
질문:전체 시간 버킷을 올바르게 선택하려면 어떻게 해야 합니까?

a1이나 a2로 선택할 수 있어요.그러나 a1 AND a2를 선택하면 요청 시간이 초과됩니다.

SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;

결과:요청이 rpc_timeout 내에 완료되지 않았습니다.

여기 나의::

cqlsh:testmulti1> DESCRIBE TABLE datasimple;

CREATE TABLE datasimple (
  dc_name text,
  time_bucket text,
  partition int,
  perf_name text,
  vm_name text,
  measurement_time timestamp,
  perf_data int,
  platform text,
  PRIMARY KEY ((dc_name, time_bucket, partition), perf_name, vm_name, measurement_time)
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

CREATE INDEX datasimple_dc_name_idx_10 ON datasimple (dc_name);

CREATE INDEX datasimple_time_bucket_idx_10 ON datasimple (time_bucket);

CREATE INDEX datasimple_perf_name_idx_10 ON datasimple (perf_name);

CREATE INDEX datasimple_vm_name_idx_10 ON datasimple (vm_name);

CREATE INDEX datasimple_platform_idx_10 ON datasimple (platform);

나는 다음을 시도하고 있습니다:

SELECT * 
FROM DataSimple 
WHERE dc_name = 'dc1' 
AND time_bucket = '2014031922' 
AND vm_name = 'vm1' LIMIT 1000;
도움이 되었습니까?

해결책

SELECT * 
FROM DataSimple 
WHERE dc_name = 'dc1' 
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;

그것은 작동하지 않을 것입니다.현재 PRIMARY KEY 이다:

PRIMARY KEY ((dc_name, time_bucket, partition),
  perf_name, vm_name, measurement_time)

Cassandra의 복합 PRIMARY KEY를 왼쪽에서 오른쪽으로 시작하는 계층적 경로로 사용해 보세요. dc_name, time_bucket, 그리고 partition 파티셔닝 키의 일부이므로 파티션 키에 각각을 포함해야 합니다. WHERE Cassandra가 데이터가 저장된 위치를 찾을 수 있도록 합니다.

그 이후의 모든 열은 클러스터링 열입니다(perf_name, vm_name, 그리고 measurement_time), 이는 디스크에 있는 데이터의 정렬 순서를 결정합니다.다시 말하지만, 이들 중 무엇을 포함할지 선택하고 선택할 수는 없습니다.스키마에 정의된 순서대로 검색해야 합니다.따라서 쿼리하고 싶다면 vm_name, 이전 열 키(perf_name 이 경우)은 귀하의 WHERE 절.

기본적으로 이 스키마를 쿼리하려면 다음을 추가하세요. AND당신에게 WHERE 다음에 대한 조항:

  • 분할
  • 성능_이름
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top