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;
上記のクエリには、複製された行のリストと、特定の行が複製された回数が表示されます。ただし、このクエリでは行がゼロであるため、そのテーブルに重複する行はありません。
だから私は知りたい:
PIではヌルと重複が許可されているため、次のようにする必要があります。
select [every column], count(*)
from mytable
group by [every column]
having count(*) > 1;
これにより、重複した行のリストを取得できます。
分析ウィンドウ関数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
)
ここで特定の列ID
に基づいて重複する行を取得するとします。以下のクエリは、Hiveのテーブルで重複しているすべてのIDを提供します。
SELECT "ID"
FROM TABLE
GROUP BY "ID"
HAVING count(ID) > 1