1. 程式人生 > >Hive之——Hive表操作

Hive之——Hive表操作

一、Hive基本使用——資料型別

1、基本資料型別

tinyint, smallint, int, bigint, boolean, float, double, string, binary, timestamp, decimal, char, varchar, date

2、集合型別

  • array: array型別是由一系列相同資料型別的元素組成,這些元素可以通過下標來訪問,例array[i]
  • map: map包含key->value鍵值對,可以通過key訪問元素,例map['key']
  • struct: 可以包含不同資料型別的元素,這些元素可以是通過"點語法"方式獲得,裡struct.key1

二、Hive表操作

  • 顯示所有表
show tables;
  • 顯示錶的表述資訊
desc [extended, formatted] tablename;
  • 顯示建表語句
show create table tablename;
  • 刪除表
drop table tablename;

三、相關注意項

1、關閉Hadoop的安全模式

hadoop dfsadmin -safemode leave

2、hive命令列顯示當前所在的資料庫

set hive.cli.print.current.db=true;

3、hive命令列顯示查詢的列表

set hive.cli.print.header=true;

四、建表例項

#建立資料表
drop table testtable;
create table if not exists testtable (
name string comment 'name value',
address string comment 'address value'
)
row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;

#檢視資料表描述資訊
desc testtable;
desc extended testtable;
desc formatted testtable;

#從本地檔案載入資料並覆蓋掉原表中的資料
load data local inpath '/usr/local/src/data' overwrite into table testtable;
從本地檔案載入資料,不覆蓋原表中的資料
load data local inpath '/usr/local/src/data' into table testtable;

#建立一個外部表
drop table if exists employees;
create external table if not exists employees(
name string,
salary float,
subordinates array<string>,
deductions map<string, float>,
address struct<street:string, city:string, state:string, zip:int>
)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
stored as textfile
location '/data/';

#插入employees中的資料格式
liuyazhuang	123	a1,a2,a3	k1:1,k2:2,k3:3	s1,s2,s3,9
  • 提示
不通過MR查詢的情況:
1、select * from 表 [limit count]
2、通過分割槽表的分割槽條件查詢

五、Hive建表的其他操作

1、由一個表建立另一個表

create table lyz1 like lyz;

2、從其他表查詢建立表

create table lyz1 as select name, addr from lyz;

六、Hive不同檔案讀取對比

1、stored as textfile

直接檢視檔案
hadoop fs -text

2、stored as sequencefile

hadoop fs -text

3、stored as rcfile

hive -service rcfilecat path

4、stored as inputformat 'class' outformat 'class'

七、Hive使用SerDe

  1. SerDe是"Serializer"和"Deserializer"的簡寫
  2. Hive使用SerDe(和FileFormat)來讀、寫表的行
  3. 讀寫資料的順序如下:
  •     HDFS檔案->InputFileFormat-><key, value>->Deserializer->row物件
  •     Row物件->Serializer-><key, value>->OutputFileFormat->HDFS

八、Hive分割槽表

1、分割槽

在Hive select查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作
分割槽表指的是在建立時指定partition的分割槽空間

2、分割槽語法

create table tablename(
name string
)
partitioned by (key type, ...)

3、建立一個分割槽表

drop table if exists employees;
create table if not exists employees(
name string,
salary float,
subordinates array<string>,
deductions map<string, float>,
address struct<street:string, city:string, state:string, zip:int>
)
partitioned by (st string, type string)
row format delimited
fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
stored as textfile;

4、Hive分割槽表操作

1) 增加分割槽
alter table tablename add if not exists partition(country='xxx'[, state='yyy']);
2) 刪除分割槽
alter table tablename drop if exists partition(country='xxx'[,state='yyyy']);
3) 查看錶中的分割槽
show partitions tablename;

九、Hive分桶

1、分桶

對於每一個表(table)或者分割槽,Hive可以進一步組成桶,也就是說桶是更為系列度的資料範圍劃分。
Hive是針對某一列進行分桶。
Hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶中。

2、好處

獲得更高的查詢處理效率
使取樣更高效

3、分桶例項

drop table if exists bucketed_user;
create table if not exists bucketed_user(
id int,
name string
)
clustered by(id) sorted by(name) into 4 buckets
row format delimited fields terminated by '\t'
sorted as textfile;

set hive.enforce.bucketing=true;

insert overwrite table bucketed_user select addr, name from testtext;