Подтвердить что ты не робот

Как получить количество строк в таблице Cassandra

Это супер базовый вопрос, но он на самом деле прослушивал меня в течение нескольких дней. Есть ли хороший способ получить эквивалент COUNT(*) данной таблицы в Кассандре?

Я буду перемещать несколько сотен миллионов строк в C * для некоторого нагрузочного тестирования, и я бы хотел, по крайней мере, получить количество строк на некоторых примерах ETL-заданий, прежде чем переносить огромные объемы данных по сети.

Лучшая идея, которую я имею, состоит в том, чтобы в основном перебирать каждую строку с помощью Python и автоматически увеличивать счетчик. Есть ли лучший способ определить (или даже оценить) размер строки таблицы C *? Я также выкарабкался вокруг Datastax Ops Center, чтобы узнать, могу ли я определить размер строки там. Если вы можете, я не вижу, как это возможно.

Кому-нибудь нужно было получить COUNT(*) таблицы в C *? Если да, как вы это делали?

4b9b3361

Ответ 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();

Ответ 9

nodetool cfstats | grep -A 1000 KEYSPACE

Замените KEYSPACE для получения сведений обо всех таблицах в этом KEYSPACE