Pergunta

Eu tenho um esquema Cassandra semelhante a este:

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

Isto é para dados de série temporal.a1 é meu id e a2 é meu intervalo de tempo.
PERGUNTA:Como seleciono corretamente um intervalo de tempo inteiro?

Posso selecionar por a1 ou a2.Mas se eu selecionar por a1 AND a2 a solicitação expira.

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

Resultado:A solicitação não foi concluída em rpc_timeout.

Aqui está o meu::

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

Estou tentando:

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

Solução

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

Isso não vai funcionar.Seu atual PRIMARY KEY é:

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

Tente pensar em usar uma CHAVE PRIMÁRIA composta no Cassandra como um caminho hierárquico, começando da esquerda para a direita. dc_name, time_bucket, e partition fazem parte da sua chave de particionamento, então você precisará incluir cada um deles em seu WHERE para garantir que Cassandra possa encontrar onde seus dados estão armazenados.

Todas as colunas depois disso são colunas de cluster (perf_name, vm_name, e measurement_time), que determinam a ordem de classificação dos seus dados no disco.Novamente, você não pode escolher qual deles incluir.Você precisa pesquisá-los na ordem em que estão definidos em seu esquema.Então, se você quiser consultar por vm_name, então você também precisa ter certeza de que as chaves da coluna anterior (perf_name neste caso) também estão presentes em seu WHERE cláusula.

Basicamente, para consultar este esquema, adicione ANDé para o seu WHERE cláusula para:

  • partição
  • nome_perf
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top