2017-05-11 6 views
0

私は、私のcassandraデータベースから独自のクライアントIDを取得する必要があります。私はCQLの次のコードでこれを達成することはできません知っている:cassandraのsomeKeySpace.someTableからcount(distinct someColumn)を選択するにはどうすればよいですか?

SELECT COUNT(DISTINCT clientid) 
FROM somekeyspace.sometable 
WHERE transdate > '2017-05-06' 
     AND transdate < '2017-05-07' 
     AND locationid = 1; 

この質問はstackoverflowの上で他のユーザーによって投稿された、まだ私は良い答えを得るように見えることはできません。これをUDFで解決することはできますか?もしそうなら、そのように見えるでしょうか?

私がUDFで持っている問題は、値の列全体をパラメータとして渡す方法がわかりません。

+0

テーブルスキーマとは何ですか? –

+0

主キー(clientid、locationID、transactionDetail) – J4ce

答えて

0

「スパークを使用する」とよいキャッシュである可能性が高いです。

はあなたの範囲のYYYY-MM-DD年代のすべてを反復処理し、count(*)それらを一緒に追加しのClientID (transdate, clientid)を格納TRANSDATEをキー、テーブルを作成するような何かを、テーブルを反転さでした。もしあなたが1日5000人以上のクライアントを持っていれば、それはおそらく縮尺が変わるでしょう(集計は非常に高価です)。 yyyy-mm-ddThh:00:00のようにより多くのパーティションバケットを追加して時間または15分(最も近い15分に丸める)することができます。

上記のようにすることはできますが、過去の履歴の合計を事前に計算して保存するジョブがあるため、「今日の」カウントだけが高価です。あなたはそれも超高速すぎる必要があり、一日の終わりにフラッシュすることができます場合は、 "今日"のカウントをredis(いくつかの%エラーで大丈夫ならハイパーログログ)に降ろすことができます。

関連する問題