Hiveは一時テーブルを使用して完全なデータを保持します
要件:
ハイブ環境では、テーブルaはフルスケールであり、テーブルbはインクリメンタルテーブルです(その日の実行のデータのみ)。
データをテーブルaに保持する必要があるが、テーブルaのテーブルbには保持しない必要があるとします。
また、テーブルbにはあるが、テーブルaにはないデータをテーブルaに追加する必要があります。
解決策1:
左外側の関連付けを使用して、最初に
テーブルaのデータを除外しますが、テーブルbのデータは除外しません。次に、テーブルbのデータをフィルタリングされたデータとマージします
------------ --- ------データの作成(Oracleのデモ)
--查询b表在a表的信息
with a as(
select 1 as id, 'Lisi' as name ,'2019-10-01' as time from dual
union all
select 2 as id, 'Wangmen' as name,'2019-10-01' as time from dual
union all
select 3 as id, 'Zhaoliu' as name,'2019-10-01' as time from dual
union all
select 4 as id, 'Pangsan' as name,'2019-10-01' as time from dual
),
b as(
select 1 as id, 'Lisi' as name,'2019-10-03' as time from dual
union all
select 2 as id, 'Wangmen' as name,'2019-10-03' as time from dual
union all
select 5 as id, 'Huangsan' as name,'2019-10-03' as time from dual
)
--使用连接
select a.id, a.name,a.time
from a
left join b
on a.id = b.id
where b.id is null
union all
select b.id,b.name,b.time
from b
;
解決策2:
最初にテーブルaとbのデータをマージし、
次に分析関数row_number()を使用して繰り返しデータを並べ替え、グループ化、並べ替え、繰り返しデータの最新データのみを保持します
----- --- -------------データの作成(oracleで示されています)
--查询b表在a表的信息
with a as(
select 1 as id, 'Lisi' as name ,'2019-10-01' as time from dual
union all
select 2 as id, 'Wangmen' as name,'2019-10-01' as time from dual
union all
select 3 as id, 'Zhaoliu' as name,'2019-10-01' as time from dual
union all
select 4 as id, 'Pangsan' as name,'2019-10-01' as time from dual
),
b as(
select 1 as id, 'Lisi' as name,'2019-10-02' as time from dual
union all
select 2 as id, 'Wangmen' as name,'2019-10-02' as time from dual
union all
select 5 as id, 'Huangsan' as name,'2019-10-02' as time from dual
)
--使用连接
SELECT id
,NAME
,TIME
,rr
FROM (SELECT id
,NAME
,TIME
,row_number() over(PARTITION BY id ORDER BY TIME DESC) AS rr
FROM (SELECT a.id
,a.name
,a.time
FROM a a
UNION ALL
SELECT b.id
,b.name
,b.time
FROM b b) c) d
WHERE d.rr = 1
;
データ量が少ないため、どちらのプランが良いかを判断し、フォローアップすることができます。