web-dev-qa-db-ja.com

Hiveで重複行を見つける方法

2つのアプローチが与えられたHiveテーブルの1つから重複する行を見つけたい。

最初のアプローチは、次の2つのクエリを使用することです。

select count(*) from mytable; // this will give total row count 

2番目のクエリは以下のとおりで、個別の行のカウントを提供します

select count(distinct primary_key1, primary_key2) from mytable;

このアプローチでは、最初のクエリを使用して得られた私のテーブルの合計行数は3500で、2番目のクエリは行数2700を返します。したがって、3500 - 2700 = 700行が重複しています。ただし、このクエリでは、どの行が重複しているかはわかりません。

重複を見つけるための2番目のアプローチは次のとおりです。

select primary_key1, primary_key2, count(*)
from mytable
group by primary_key1, primary_key2
having count(*) > 1;

上記のクエリには、複製された行のリストと、特定の行が複製された回数が表示されます。ただし、このクエリでは行がゼロであるため、そのテーブルに重複する行はありません。

だから私は知りたい:

  1. 私の最初のアプローチが正しい場合-はいの場合、どの行が重複しているかを見つけるにはどうすればよいですか
  2. なぜ2番目のアプローチは複製された行のリストを提供しないのですか?
  3. 重複を見つける他の方法はありますか?
5
Shekhar

PIではヌルと重複が許可されているため、次のようにする必要があります。

select [every column], count(*)
from mytable
group by [every column]
having count(*) > 1;

これにより、重複した行のリストを取得できます。

9
Alex

分析ウィンドウ関数row_number()は非常に便利で、partition by句で指定された要素に基づいて重複を提供できます。単純なインラインビューおよび存在節は、元のテーブルからこれらの重複を含む対応するレコードのセットを特定します。一部のデータベース(TDなど)では、QUALIFYプラグマオプションを使用してインラインビューを省略できます。

SQL1とSQL2は組み合わせることができます。 SQL2:単純に却下するのではなく、NULLを処理したい場合、合体と連結の方が良いかもしれません

SELECT count(1) , count(distinct coalesce(keypart1 ,'') + coalesce(keypart2 ,'') )  
  FROM srcTable s

3)1つ以上のレコードだけでなく、すべてのレコードを検索します。これにより、すべてのコンテキストデータとキーが提供されるため、キーだけでなく、DUPの原因を分析する際に役立ちます。

select * from  srcTable s
where exists 
    ( select 1 from (
                SELECT  
                      keypart1,
                      keypart2,
                      row_number() over( partition by keypart1, keypart2 )  seq  
                FROM srcTable t 
                WHERE 
                  -- (whatever additional filtering you want) 
                ) t 
                where seq > 1 
                AND t.keypart1 = s.keypart1
                AND t.keypart2 = s.keypart2
    ) 
1
rabkaman

ここで特定の列IDに基づいて重複する行を取得するとします。以下のクエリは、Hiveのテーブルで重複しているすべてのIDを提供します。

SELECT "ID"
FROM TABLE
GROUP BY "ID"
HAVING count(ID) > 1
0
Maneesh Bishnoi