2016-10-05 8 views
0

次のスキーマを持つSpark DataFrameがあります。Spark SQL:キーでグループ化された最大と合計

counts 
|-- index: string 
|-- name: string 
|-- count: long 

私は、各indexためcount列を合計しても、そのはnameを対応するとともに、最大countを見つけるしたいと思います。そのため、各行には、一意のindexと、SUM(count)と、MAX(count)と、対応するnameが含まれます。

次のクエリを実行して、エントリをindexでグループ化し、countの列を選択します。

SELECT * FROM counts 
WHERE (index, count) 
IN (
    SELECT index, MAX(count) 
    FROM counts 
    GROUP BY index 
) 
ORDER BY count DESC 

これは正常に動作してくれ、最高countと行を含むindexごとに一意の行を提供します。

ただし、元の表に基づいてでグループ化された合計がcountである列を追加したいとします。

私はこのクエリでindexで再生回数とグループにそれらを合計することができます

SELECT index, SUM(count) 
FROM counts 
GROUP BY index 

しかし、私は(効率的な方法で照会)両方のクエリの結果を含む統一されたテーブルを持っていると思います。

この件に関するご意見は大変ありがとうございます。

答えて

1

ただ、ウィンドウ関数を使用します。

SELECT c.* 
FROM (SELECT c.*, SUM(count) OVER (PARTITION BY index) as cnt, 
      ROW_NUMBER() OVER (PARTITION BY index ORDER BY count DESC) as seqnum 
     FROM counts c 
    ) c 
WHERE seqnum = 1; 

これは、あなたが残しておきたい他の列を前提としています。あなただけの各indexの最大および合計をしたい場合:それはSQLのキーワードであるため

SELECT index, MAX(count), SUM(count) 
FROM counts 
GROUP BY index; 

indexは、(「インデックスを作成」と思う)、列の悪い名前です。

関連する問題