Кассандра:ВЫБЕРИТЕ СТРОКУ по составному ключу

StackOverflow https://stackoverflow.com//questions/23028441

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть схема Cassandra, похожая на эту:

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

Это относится к данным временных рядов.a1 - это мой идентификатор, а a2 - это мое время.
ВОПРОС:Как мне правильно выбрать весь временной интервал?

Я могу выбрать по a1 или a2.Но если я выбираю по a1 И 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 в виде иерархического пути, начинающегося слева направо. dc_name, time_bucket, и partition являются частью вашего ключа разделения, поэтому вам нужно будет включить каждый из них в свой WHERE чтобы гарантировать, что Cassandra сможет найти, где хранятся ваши данные.

Все столбцы после этого являются столбцами кластеризации (perf_name, vm_name, и measurement_time), которые определяют порядок сортировки ваших данных на диске.Опять же, вы не можете выбирать, что из этого включить.Вам нужно выполнить поиск по ним в том порядке, в котором они определены в вашей схеме.Итак, если вы хотите запросить с помощью vm_name, тогда вам также нужно убедиться , что предыдущий столбец содержит ключи (perf_name в данном случае) также присутствуют в вашем WHERE оговорка.

В основном, чтобы запросить эту схему, добавьте ANDs к вашему WHERE оговорка для:

  • перегородка
  • имя_перфонаря
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top