Hiveでは、カウント(個別)はグループバイよりもレデューサーへのワークロードのバランスが崩れ、1つの悲しいレデューサーがすり減ってしまう可能性が高いと思います。以下のクエリ例。
どうして?
クエリの例:
select count(distinct user)
from some_table
Group-by付きのバージョン(より高速として提案):
select count(*) from
(select user
from some_table
group by user) q
注: このプレゼンテーション のスライド26は、問題について説明しています。
select count(distinct user)
from some_table;
このクエリは、マップ側でカウントを行います。各マッパーは、カウントという1つの値を出力します。次に、すべての値を集計して合計数を生成する必要があります。これは、1つのレデューサーの仕事です。
select count(*) from
(select user
from some_table
group by user) q;
このクエリには2つの段階があります。ステージ1で、GROUP BYはマップ側のユーザーを集約し、ユーザーごとに1つの値を発行します。次に、出力を集約する必要があります。ただし、多くのレデューサーを使用できます。ステージ2では、マップ側でCOUNT
が実行され、1つのレデューサーを使用して最終結果が集計されます。
したがって、マップ側の分割が非常に多い場合、最初のクエリは非常に多くの1つの値の結果を集約する必要があります。 2番目のクエリでは、ステージ1のリデュース側で多くのレデューサーを使用できます。ステージ2では、最後に1つのレデューサーのタスクが小さくなります。
これは通常、最適化ではありません。クエリ1レデューサーが問題になるには、かなりの数のマップ分割が必要になります。 2番目のクエリには2つのステージがあり、それだけではクエリ1よりも遅くなります(ステージ2は、ステージ1が完全に完了するまで開始できません)。ですから、私はあなたが得たアドバイスのいくつかの理由を見ることができますが、適切な測定が行われ、改善が見られない限り、私は懐疑的です。