天天看點

Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)

Hive查詢、Hive Join和Hive集合操作

  • Hive查詢
    • SELECT基礎
    • CTE和嵌套查詢
    • 進階語句
  • Hive Join
    • 關聯查詢
    • MapJoin
  • Hive集合操作(UNION)

Hive查詢

SELECT基礎

  • SELECT用于映射符合指定查詢條件的行
  • Hive SELECT是資料庫标準SQL的子集

    使用方法類似于MySQL

#查詢顧客表中地區為“NY”所在城市為'New York'的使用者
select * from customers where customer_state="NY" and customer_city="New York";
#查詢訂單表中共有多少不同顧客下過訂單
select count(distinct order_customer_id) from orders;
#查詢商品表中前5個商品
select * from products limit 5;
           
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)

CTE和嵌套查詢

  • CTE(Common Table Expression)
create table jobs_details as 
with 
tmp as (select jobs from employee_partition where info.gender='Male'),
t2 as (select jobs from employee_partition where info.gender='Female')
select tmp.jobs male_job,t2.jobs female_job from tmp,t2;
           
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)
  • 嵌套查詢

    嵌套查詢示例

進階語句

  • 列比對正規表達式
#使用列比對正規表達式需要進行設定
set  hive.support.quoted.identifiers = none;
#列比對正規表達式查詢
select `a.*` from employee_partition;
select `.*n.*` from employee_partition;
           
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)
  • 虛拟列(Virtual Columns)

    兩個連續下劃線,用于資料驗證:

    input__file__name:Mapper Task的輸入檔案名稱

    block__offset__inside__file:目前全局檔案位置

Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)

Hive Join

關聯查詢

  • 指對多表進行聯合查詢
  • JOIN用于将兩個或多個表中的行組合在一起查詢
  • 類似于SQL JOIN,但是Hive僅支援等值連接配接

    内連接配接:inner join

    外連接配接:outer join(right join, left join, full outer join)

    交叉連接配接:cross join

    隐式連接配接:Implicit join

  • join發生在where子句之前
select name,address[0],info.age from employee_partition e join a_p a on e.add=a.test;

select concat(customer_fname,' ',customer_lname) name from customers left join orders on customer_id=order_customer_id where order_id is null;
           
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)

MapJoin

  • MapJoin操作在Map端完成

    小表關聯大表

    可進行不等值連接配接

  • 開啟join操作
set hive.auto.convert.join=true(預設值)
           

運作時自動将連接配接轉換為MapJoin

-MapJoin操作不支援:

在union all, lateral view, group by/join/sort by /cluster by/distribute by等操作後面

在union, join以及其他 MapJoin之前

select /*+mapjoin(customers)*/ customer_fname from customers 
left join orders on customer_id=order_customer_id 
where order_id is null;
           
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)

Hive集合操作(UNION)

  • 所有子集資料必須具有相同的名稱和類型

    union all:合并後保留重複項

    union:合并後删除重複項(v1.2之後)

  • 可以在頂層查詢中使用(0.13.0之後)
  • ORDER BY, SORT BY, CLUSTER BY, DISTRIBUTE BY 和LIMIT适用于合并後的整個結果
  • 集合其他操作可以使用JOIN/OUTER JOIN來實作

    差集、交集

select key from
(select key from src1 order by key kimit 10) sub
union all 
select key from src2
order by ke limit 10
           
Hive查詢、Hive Join和Hive集合操作Hive查詢Hive JoinHive集合操作(UNION)

繼續閱讀