これは非常に基本的な質問ですが、実際には何日も私を悩ませてきました。 Cassandraの特定のテーブルのCOUNT(*)
に相当するものを取得する良い方法はありますか?
いくつかの負荷テストのために数億行をC *に移動し、ネットワーク上で大量のデータを移動する前に、少なくともいくつかのサンプルETLジョブの行数を取得したいと思います。
私が持っている最良のアイデアは、基本的にPythonで各行をループし、カウンターを自動インクリメントすることです。C*テーブルの行サイズを決定(または推定)するより良い方法はありますか?また、Datastax Ops Centerを調べて、そこで行サイズを決定できるかどうかを確認しました。
C *でテーブルのcount(*)
を取得する必要がある人はいますか?もしそうなら、どのようにそれをやりに行きましたか?
はい、COUNT(*)
を使用できます。 ドキュメント です。
COUNT(*)を使用するSELECT式は、クエリに一致した行の数を返します。または、COUNT(1)を使用して同じ結果を取得できます。
Usersテーブルの行数を数えます:
SELECT COUNT(*) FROM users;
正確なカウントが必要ない場合は、nodetool cfhistograms
から推定値を取得することもできます(これらの値は推定値です)。
DSEを実行している場合は、sparkも使用できます。
あなたは避けるためにコピーを使用することができますcassandraタイムアウトは通常count(*)で発生します
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'
nodetool tablestats
は、行の見積もり(およびその他のテーブル統計)をすばやく取得するのに非常に便利です。
nodetool tablestats <keyspace.table>
特定のテーブル用
$nodetool settimeout read 360000
cqlsh -e "SELECT COUNT(*) FROM table;" --request-timeout=3600
私は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から取得する数値は、カウンターが安定するのに十分な時間、さらなる更新を防止する場合にのみ正しいです。それ以外の場合は、常におおよその結果になります。
大きなテーブルのcount(*)
の場合、Cassandraの上にPrestoを使用できます。私はテストしましたが、うまくいきます。
同じことについては、以下のURLを参照してください。キーワード検索:Cassandra question v3.11.3…
select count(*) from table1
C#Linqコンポーネントアダプターを使用している場合は、次を使用できます。
var t = new Table<T>(session);
var count = t.Count().Execute();