Как получить количество строк в таблице Cassandra
Это супер базовый вопрос, но он на самом деле прослушивал меня в течение нескольких дней. Есть ли хороший способ получить эквивалент COUNT(*)
данной таблицы в Кассандре?
Я буду перемещать несколько сотен миллионов строк в C * для некоторого нагрузочного тестирования, и я бы хотел, по крайней мере, получить количество строк на некоторых примерах ETL-заданий, прежде чем переносить огромные объемы данных по сети.
Лучшая идея, которую я имею, состоит в том, чтобы в основном перебирать каждую строку с помощью Python и автоматически увеличивать счетчик. Есть ли лучший способ определить (или даже оценить) размер строки таблицы C *? Я также выкарабкался вокруг Datastax Ops Center, чтобы узнать, могу ли я определить размер строки там. Если вы можете, я не вижу, как это возможно.
Кому-нибудь нужно было получить COUNT(*)
таблицы в C *? Если да, как вы это делали?
Ответы
Ответ 1
Да, вы можете использовать COUNT(*)
. Здесь documentation.
Выражение SELECT с использованием COUNT (*) возвращает количество строк, соответствующих запросу. Кроме того, вы можете использовать COUNT (1), чтобы получить тот же результат.
Подсчитайте количество строк в таблице пользователей:
SELECT COUNT(*) FROM users;
Ответ 2
Вы также можете получить некоторые оценки от nodetool cfhistograms
, если вам не нужен точный счет (эти значения являются оценками).
Вы также можете использовать искру, если вы используете DSE.
Ответ 3
nodetool tablestats
может быть очень удобно для быстрого получения оценок строк (и других таблиц).
nodetool tablestats <keyspace.table>
для конкретной таблицы
Ответ 4
Вы можете использовать копию, чтобы избежать тайм-аута Кассандры обычно происходит на счет (*)
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/.*//'
Ответ 5
$nodetool settimeout read 360000
cqlsh -e "SELECT COUNT(*) FROM table;" --request-timeout=3600
Ответ 6
Я работал с Elasticsearch, и это может быть ответом на эту проблему... Предполагая, что вы готовы использовать Elassandra вместо Cassandra.
Поисковая система поддерживает много статистики, и в течение нескольких секунд после последних обновлений она должна иметь представление о том, сколько строк в таблице.
Вот запрос соответствия всех запросов, который дает вам информацию:
curl -XGET \
-H 'Content-Type: application/json' \
"http://127.0.0.1:9200/<search-keyspace>/_search/?pretty=true"
-d '{ "size": 1, "query": { "match_all": {} } }'
Где <search-keyspace>
- это пространство ключей, которое создает Elassandra. Обычно он называется как <keyspace>_<table>
, поэтому если у вас есть пространство ключей с именем foo
и таблица с именем bar
в этом пространстве ключей, URL будет использовать .../foo_bar/...
Если вы хотите получить общее количество строк во всех ваших таблицах, просто используйте /_search/
.
Выводом является JSON, который выглядит следующим образом:
{
"took" : 124,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 519659, <-- this is your number
"max_score" : 1.0,
"hits" : [
{
"_index" : "foo_bar",
"_type" : "content",
"_id" : "cda683e5-d5c7-4769-8e2c-d0a30eca1284",
"_score" : 1.0,
"_source" : {
"date" : "2018-12-29T00:06:27.710Z",
"key" : "cda683e5-d5c7-4769-8e2c-d0a30eca1284"
}
}
]
}
}
И с точки зрения скорости, это занимает миллисекунды, независимо от количества строк. У меня есть таблицы со многими миллионами строк, и это работает как шарм. Не нужно ждать часа или чего-то в этом роде.
Как уже упоминалось, Elassandra по-прежнему является системой, интенсивно используемой параллельно многими компьютерами. Счетчики изменятся быстро, если у вас будет много обновлений все время. Таким образом, числа, которые вы получаете от Elasticsearch, являются правильными, только если вы предотвращаете дальнейшие обновления в течение достаточно долгого времени, чтобы счетчики установились. В противном случае это всегда будет приблизительный результат.
Ответ 7
Для тех, кто использует компонентный адаптер С# Linq, вы можете использовать:
var t = new Table<T>(session);
var count = t.Count().Execute();
Ответ 8
Для count(*)
для больших столов вы можете использовать Presto поверх Cassandra. Я проверил, и это работает хорошо.
Пожалуйста, смотрите ниже URL для того же: Поиск по ключевому слову: Cassandra question v3.11.3…
select count(*) from table1
URL: вопрос Кассандры v3.11.3... выберите количество (*) из таблицы1
Ответ 9
nodetool cfstats | grep -A 1000 KEYSPACE
Замените KEYSPACE для получения сведений обо всех таблицах в этом KEYSPACE