1. 程式人生 > >關於hive 子查詢、union 、left join

關於hive 子查詢、union 、left join

建表語句: create table  tb_in_base (    id  bigint,    devid bigint,     devname string
) partitioned by (job_time bigint) row format delimited fields terminated by ‘,’; create table  tb_in_up (    id  bigint,    devid bigint,    devname string
) partitioned by (job_time bigint) row format delimited fields terminated by ‘,’; 場景一:單表子查詢沒有指定表別名 語句:select * from (select id,devid,job_time from tb_in_base) ; 執行過程:
提示需要指定子查詢源。 加上表別名: 語句:select * from (select id,devid,job_time from tb_in_base) a; 執行過程: 加了表別名後可以正常輸出子查詢中的資料。 結果分析:在hive中若有子查詢必須指定子查詢的表別名 場景二:單表查詢外圍欄位比子查詢少一個 語句: select id,devid from (select id,devid,job_time from tb_in_base) a;  執行過程: 結果分析:輸出外圍指定欄位的資料 。 場景三:兩張表進行union all 語句:  select a.id,a.devid from (select a.id,a.devid,a.job_time from tb_in_base a union all select b.id,b.devid,b.job_time from tb_in_up b) a; 執行過程:
結果分析:兩張表進行union all 取相同的欄位名稱,可正常輸出指定資料內容,且結果為兩張表的結果集 場景四:兩張表進行union  語句:  select a.id,a.devid from (select a.id,a.devid,a.job_time from tb_in_base a union all select b.id,b.devid,b.job_time from tb_in_up b) a; 執行過程: 結果分析:hive 不支援union  場景五:外圍使用count、sum 統計id  語句: select count(a.id),sum(a.id)  from (select a.id,a.devid,a.job_time from tb_in_base a union all select b.id,b.devid,b.job_time from tb_in_up b) a; 執行過程:
結果分析:兩表直接進行union all 可以使用count、sum 等聚合函式  場景六:union all 時使用count、sum 、max等 聚合函式 結果分析:union all 時不能使用count、sum 、max等 聚合函式,單表可以進行聚合函式使用,如下圖: 場景七:left join 是否可以使用max、count、sum 等函式  語句: select max(a.id),min(b.id),sum(a.job_time),count(a.id) from tb_in_base a join tb_in_up b on (a.id=b.id); 執行過程:  結果分析:在left join 中可以使用max、count等聚合函式。 總結分析 1. 子查詢相當於表名,使用 from 關鍵字需要指定真實表名或表別名。 2. hive 不支援union ,只支援union all  3. 子查詢中使用union all 時,在子查詢裡不能使用count、sum 等 聚合函式  4. 兩表直接進行union all 可以使用count、sum 等聚合函式  5. 兩張表進行union all 取相同的欄位名稱,可正常輸出指定資料內容,且結果為兩張表的結果集