سؤال

لدي مخطط كاساندرا مشابه لهذا:

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 بند.

في الأساس للاستعلام عن هذا المخطط، أضف ANDق لك WHERE شرط ل:

  • تقسيم
  • اسم الأداء
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top