Данные хранятся неорганизованно в Datastax Astra DB

Я загрузил свой CSV-файл в свою базу данных Datastax Astra. Дело в том, что при загрузке данных строки становятся неорганизованными или случайными. Скажем, если в моем csv идентификатор строки похож на 1, 2, 3, ... Затем, когда я загружаю это в свою БД, он загружается в зашифрованном / перегруппированном виде, скажем, как идентификатор строки 2, 1, 4, 5, 3 .. . По этой причине, когда я запрашиваю данные через http_methodsв python данные также поступают в том виде, в котором они хранятся, то есть неорганизованным образом. Почему это происходит ? И есть ли способ решить эту проблему?

2 ответа

Все сводится к тому, как Cassandra хранит ваши данные. Я предполагаю, что вы определяете только partition keyвнутри первичного ключа. Ключ раздела отвечает за то, как данные хранятся на узлах вашего кластера. Если вы хотите, чтобы ваши данные были в определенном порядке, вам нужно определить вторую часть первичного ключа, clustering key.

Я предлагаю взглянуть на этот ответ, который дает отличное объяснение заказа /questions/41782231/gde-i-zakazat-po-punktam-v-cassandra-cql/41782240#41782240

Почему это происходит ?

Ответ dwettlaufer точен, но я предоставлю визуальное представление, чтобы помочь понять, что здесь происходит:

      > SELECT id,token(id),name FROM numbers ;

 id | system.token(id)     | name
----+----------------------+-------
  5 | -7509452495886106294 |  five
  1 | -4069959284402364209 |   one
  2 | -3248873570005575792 |   two
  4 | -2729420104000364805 |  four
  3 |  9010454139840013625 | three

(5 rows)

Данные в Astra DB хранятся в порядке по хешированному значению токена ключа раздела. Из-за хэша числовые значения, скорее всего, будут расположены в другом порядке.

И есть ли способ решить эту проблему?

Как уже упоминалось, порядок сортировки может быть реализован только в пределах ключа раздела. Поэтому, если в качестве ключа раздела используется другой столбец, id можно использовать для сортировки данных в нем.

Рассмотрим таблицу, которая выглядит так:

      CREATE TABLE dept_numbers (
    dept int,
    id int,
    name TEXT,
PRIMARY KEY(dept,id));

Тогда сработает что-то вроде этого:

      > SELECT * FROM dept_numbers WHERE dept=1;

 dept | id | name
------+----+-------
    1 |  1 |   one
    1 |  2 |   two
    1 |  3 | three
    1 |  4 |  four
    1 |  5 |  five

(5 rows)

Обратите внимание, что все запросы с Astra DB должны иметь WHEREпункт. Без него получится дорогостоящее сканирование таблицы.

Другие вопросы по тегам