Данные хранятся неорганизованно в 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
пункт. Без него получится дорогостоящее сканирование таблицы.