Hive基本命令解析

1. Hive的分區做用

命令:建立分區

create table t_sz_part(id int, name string)
partitioned by (country string)
row format delimited
fields terminated by ','

往分區中插入數據:load data local inpath '/home/hadoop/sz.dat' into table t_sz_part partition(country = 'China');java

說明:首先,建立分區表的時候,須要經過關鍵字partitioned by (name string) 聲明該表是分區表,而且是按照字段name進行分區的;其次,向分區表導入數據的時候,要經過關鍵字partition(country='China')顯示聲明數據要導入到表的哪一個分區中。所謂分區,這是將知足某些條件的記錄打包,作個記號,在查詢時提升效率,至關於按文件夾對文件進行分類,文件夾名可類比分區字段。這個分區字段形式上存在於數據表中,在查詢時會顯示到客戶端上,但並不真正在存儲在數據表文件中,是所謂僞列。因此,千萬不要覺得是對屬性表中真正存在的列按照屬性值的異同進行分區。好比上面的分區依據的列country並不真正的存在於數據表中,是咱們爲了方便管理添加的一個僞列,這個列的值也是咱們人爲規定的,不是從數據表中讀取以後根據值的不一樣將其分區。咱們並不能按照某個數據表中真實存在的列,如id來分區。oop

2. Hive的分桶做用

命令:建立分桶

create table t_bluk(id string, name string)
clustered by(id) sort by (id) into 4 buckets;

解析:clustered by(id) 意思是根據id分紅4個桶,而且桶內按照id排序。spa

上述命令執行後,將會在相應的hdfs文件目錄下建立四個子目錄,如:3d

可能遇到的問題:當使用命令「insert into t_buck select * from other」時,出現t_buck目錄下並無四個子目錄,只有一個子目錄,須要以下操做:code

① 設置以下變量:orm

#設置變量,設置分桶爲true, 設置reduce數量是分桶的數量個數
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;

② 使用「insert ... select ...」命令向t_buck插入數據纔會最終生成四個分區。blog

額外說明:insert into t_buck select id,name from t_p distribute by (id) sort by (id);排序

 distribute by (id)指定分區字段; sort by (id) 指定排序字段 hadoop

當排序和分桶的字段相同的時候能夠使用 distribute by (sno) sort by (sno asc) 或Cluster by(字段)。cluster by等同於分桶+排序(sort)string

分區和分桶的區別:分區依據的是僞列,分桶則是相對分區進行更細粒度的劃分。分桶將整個數據內容按照某列屬性值的hash值進行區分,如要按照name屬性分爲3個桶,就是對name屬性值的hash值對3取摸,按照取模結果對數據分桶。如取模結果爲0的數據記錄存放到一個文件,取模爲1的數據存放到一個文件,取模爲2的數據存放到一個文件。與分區不一樣的是,分區依據的不是真實數據表文件中的列,而是咱們指定的僞列,可是分桶是依據數據表中真實的列而不是僞列。因此在指定分區依據的列的時候要指定列的類型,由於在數據表文件中不存在這個列,至關於新建一個列。而分桶依據的是表中已經存在的列,這個列的數據類型顯然是已知的,因此不須要指定列的類型。

3. Hive的join操做解析

 稍後補上

相關文章
相關標籤/搜索