web-dev-qa-db-ja.com

Cassandra=テーブルの行数を取得する方法

これは非常に基本的な質問ですが、実際には何日も私を悩ませてきました。 Cassandraの特定のテーブルのCOUNT(*)に相当するものを取得する良い方法はありますか?

いくつかの負荷テストのために数億行をC *に移動し、ネットワーク上で大量のデータを移動する前に、少なくともいくつかのサンプルETLジョブの行数を取得したいと思います。

私が持っている最良のアイデアは、基本的にPythonで各行をループし、カウンターを自動インクリメントすることです。C*テーブルの行サイズを決定(または推定)するより良い方法はありますか?また、Datastax Ops Centerを調べて、そこで行サイズを決定できるかどうかを確認しました。

C *でテーブルのcount(*)を取得する必要がある人はいますか?もしそうなら、どのようにそれをやりに行きましたか?

39
evanv

はい、COUNT(*)を使用できます。 ドキュメント です。

COUNT(*)を使用するSELECT式は、クエリに一致した行の数を返します。または、COUNT(1)を使用して同じ結果を取得できます。

Usersテーブルの行数を数えます:

SELECT COUNT(*) FROM users;
45
catpaws

正確なカウントが必要ない場合は、nodetool cfhistogramsから推定値を取得することもできます(これらの値は推定値です)。

DSEを実行している場合は、sparkも使用できます。

9
phact

あなたは避けるためにコピーを使用することができますcassandraタイムアウトは通常count(*)で発生します

cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'

8
Shubham

nodetool tablestatsは、行の見積もり(およびその他のテーブル統計)をすばやく取得するのに非常に便利です。

nodetool tablestats <keyspace.table>特定のテーブル用

6
Lucian Thorr
$nodetool settimeout read 360000
cqlsh -e "SELECT COUNT(*) FROM table;" --request-timeout=3600
3
Aleksandr M.

私はElasticsearchで作業してきましたが、これはこの問題の答えになる可能性があります... Cassandraの代わりに Elassandra を使用する意思があると仮定します。

検索システムは多くの統計情報を保持しており、最後の更新から数秒以内に、テーブルに含まれる行数を把握する必要があります。

以下に、情報を提供する Match All Query リクエストを示します。

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から取得する数値は、カウンターが安定するのに十分な時間、さらなる更新を防止する場合にのみ正しいです。それ以外の場合は、常におおよその結果になります。

3
Alexis Wilke

大きなテーブルのcount(*)の場合、Cassandraの上にPrestoを使用できます。私はテストしましたが、うまくいきます。

同じことについては、以下のURLを参照してください。キーワード検索:Cassandra question v3.11.3…

select count(*) from table1

URL: Cassandra質問v3.11.3 ... table1からcount(*)を選択

0
Hareesha

C#Linqコンポーネントアダプターを使用している場合は、次を使用できます。

var t = new Table<T>(session);
var count = t.Count().Execute();
0
Crunchy234