2017-11-14 5 views
2

KSQLを使用して、特定のカラムのエントリをGROUP BYでカウントするのではなく、アプリケーションをストリームするすべてのエントリに対して集計を取得できますか?KSQLですべてのエントリを数える

私はこのような何かを探しています:KSQLで

| Count all | Count id1 | count id2 | 
| ---245----|----150----|----95-----| 

以上のこのような:

[some timestamp] | Count all | 245 
[some timestamp] | Count id1 | 150 
[some timestamp] | Count id2 | 95 
. 
. 
. 


ありがとう - ティム

+2

ので、擬似SQL、FOO' FROM 'SELECT COUNT(*)、COUNT(DISTINCT ID1)、COUNT(DISTINCT ID2)のようなものでは?あなたが何をしているのですか? –

+0

はい、これが最初のアイデアです。しかし、最終的なアイデアは、レコードの全量を単純に数えるだけでした(*)。 @Hojjatの答えは、それが完璧に正常に動作しているようですね! –

答えて

5

をあなたのために、両方のカウントを持つことはできませんすべてのキーと同じクエリ内の各キーのカウント。ここでは、指定された列の各値をカウントするクエリと、指定された列のすべての値をカウントするクエリの2つのクエリを使用できます。 2つの列col1とcol2を持つストリームがあるとします。 KSQLは常に集約のためのGROUP BY句を必要とするので、あなたは2つのクエリを記述する必要があるすべての行をカウントする

SELECT col1, count(*) FROM mystream1 GROUP BY col1; 

:あなたは次のクエリを使用することができます無限のウィンドウサイズでCOL1の各値をカウントする 。最初に、一定の値を持つ新しい列を作成し、新しい列の値を数えることができます。定数であるため、数はすべての行の数を表します。次に例を示します。

CREATE STREAM mystream2 AS SELECT 1 AS col3 FROM mystream1; 
SELECT col3, count(*) FROM mystream2 GROUP BY col3; 
+0

パーフェクト、ありがとう、2番目の部分はまさに私が探していたものでした!ありがとう –

+1

キーの値が1つの高いデータレート集約のトピックがある場合は、トピックを再分割し、すべてのメッセージを1つのパーティションに送信し、スケーリングの問題が発生する可能性があることに注意してください。したがって、このアプローチを使用する際は注意が必要です。 – Hojjat

+0

お分かりいただき、ありがとうございます。 これは主にテストに使用されるので、幸運にもプロダクションではありません。 –

関連する問題