Hive SQL(分區和分桶)

1.HIVE 分區表

在 hive select 查詢中一般會掃描整個內容,消耗很多時間組沒必要的工作.有時候只需要掃描表中的一部分關心的數據,因此建表時引入了partition 概念.

分區表指的是在創建表時指定的partition的分區空間,Hive可以對數據按照某列或者某些列進行分區管理

\舉個例子:當前互聯網應用每天都要存儲大量的日誌文件,幾G、幾十G甚至更大都是有可能。存儲日誌,其中必然有個屬性是日誌產生的日期。在產生分區時,就可以按照日誌產生的日期列進行劃分。把每一天的日誌當作一個分區

將數據組織成分區,主要可以提高數據的查詢速度.至於用戶儲存的每一條記錄到底放在哪個分區,由用戶來決定.即用戶在加載數據的時候必須現實地指定該部分數據放到哪.個分區

1.1實現細節

  • 一個表可以擁有一個或者多個分區,每個分區以文件夾的形式單獨存放在表文件夾的目錄
  • 表和列名不區分大小寫
  • 分區十一字段的形式在表結構中存在,通過describe table 命令可以查看到字段存在,但是該字段不存放實際的數據內容,僅僅是分區的表示

1.2語法

創建一個分區表:

create table table_name(

id int ,name string)

partitioned  by (year int, month int)

row format delimited

fields terminated by '|'

collection items terminated by ','

map keys terminated by ':'

添加分區

alter table table_name add partition (year=2017,month=6) partition (year=2017,month=7) partition (year=2018,month=8);

動態分區的添加(在添加數據時自動生成分區)

注意:用戶必須現制定一個靜態分區列

先確認配置爲true

set hive.exec.dynamic.partition

確認爲true後再修改 hive.exec.dynamic.paritition.mode=nonstrict

set hive.exec.dynamic.partition.mode=nonstrict

自動添加一個沒有的2018-9的分區

insert into table table_name partition (year=2018,month) values ('lisi','2018-8-12',8),('zhangsan','2018-9-10',9);

2.nonstrictHive 桶

對於每個表(table) 或者分區,hive 可以進一步組織成桶,也就是說桶時更爲精細的數據範圍劃分.hive 也是針對某一列進行桶的組織. hive採用隊列值哈希,然後除以桶的個數求餘的方式決定該條記錄存放在那個桶中

把表(或者分區)組織成桶有兩個理由:

(1)獲得更高的查詢處理效率.桶爲表加上了額外的結構,hive 在處理有些查詢時利用這個結構,具體而言,連接兩個在相同列上劃分了桶的表,可以用map連接(map-side join) 高效的實現.比如join操作 對於join操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作,那麼將保存相同列值的通進行join操作就可以,可以大大減少join的數據量

(2)取樣更高效.在處理大規模數據集時,在開發和修改查詢的階段,如果能在數據集的一小部分數據上試運行查詢,會帶來很多方便

2.1語法

create table bucketed_user(

id int,name string)

clustered by (bucketed_user) into 2 buckets

row format delimited
fields terminated by '|'

collection items terminated by','

map keys terminated by ':'

stored as textfile; 

隨機抽樣基於整行數據

select * from table_name tablesample(bucket 3 out of 32 on rand()) s;

隨機抽樣基於指定列(使用分桶列更高效)

select * from table_name tablesample(bucket 3 out of 32 on id) s;

隨機抽樣基於block size

SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;

SELECT * FROM table_name TABLESAMPLE(1M) s;

SELECT * FROM table_name TABLESAMPLE(10 rows) s;

3.Hive 視圖常用操作

語法:

  • 建立視圖: create view view_name as select statement;
  • 建立視圖支持  CTE,ORDER BY,LIMIT,JOIN,etc
  • 查找視圖 show tables;(show views after hive v2.2.0)
  • 顯示view :show create table view_name;
  • 刪除視圖:drop view_name;
  • 更改視圖屬性 :alter view view_name set tblproperties('comment'='This is view');
  • 更改視圖定義:alter view view_name as select statement; 

Hive 排序

  1. order by 會對數據進行全局排序,和oracle和mysql等數據庫中的order by 效果一樣,他只在一個reduce中進行,所以數據量特別大的時候效率特別低
  2. sort by 是單獨在各自的reduce中進行排序,所以並不能保證全局排序,一般和distribute by一起執行,而且distribute by 要寫在sort by 前面
  3. distribute by 會對指定的字段按照hashCode值對reduce的個數取模,然後將任務分配到對應的reduce中去執行,就是在mapreduce程序中的patition分區過程,默認根據指定key.hashCode()確定處理該人物的reduce
  4. cluster by :distribute by 和sort by 合用就相當於cluster by 但是 cluster不能指定排序asc或者desc的規則,只能是desc倒序排列

Hive 數據的導入與導出

load data 加 local 和不加local的區別
```local 是導入本地文件  採用複製方式
```不加local 是導入hdfs數據  採用剪切
use school;
export table class to 'tmp/out'(先將表導出到hdfs文件夾)
use school;
import table class2 from 'tmp/out'(再從dfs文件中導入新的表中)
HIVE 排序

row_number: 排名不重複,序號連續

rank:排名重複序號不連續

dense_rank:排名重複,序號連續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章