Hive表庫基本操作


Hive的數據類型

Hive的基本數據類型

Hive的復雜數據類型

復雜數據類型包括數組(ARRAY)、映射(MAP)和結構體(STRUCT),具體如下表所示:

 

Hive的表庫操作

Hive的數據庫操作

Hive中數據庫的概念本質上僅僅是表的一個目錄或者命名空間。然而,對於具有  很多組和用戶的大集群來說,這是非常有用的,因為這樣可以避免表命名沖突。

如果用戶沒有使用use關鍵字顯示指定數據庫,那么將會使用默認的數據庫default。

查看數據庫

show databases;

使用like關鍵字實現模糊匹配

show databases like 'hive_*'; 檢索以hive開頭的數據庫

使用數據庫

use  數據庫名稱;

創建數據庫

create database  數據庫名;

刪除數據庫

drop database  數據庫名;(這種刪除,需要將對應數據庫中的表全部刪除后才能刪除數據庫)

drop database 數據庫名 cascade;(強制刪除,自行刪除所有表)

查看數據庫的描述

desc database 數據庫名;

Hive的數據表操作

顯示數據庫中的表

show tables;

使用like關鍵字實現模糊匹配

show tables like 'hive_*';

顯示表的詳細信息

desc [formatted] hive_01;(加上formatted顯示的更詳細

創建數據表(與MySQL類似)

create [external] table [if not exists] table_name [(col_name data_type [comment col_comment], ...)] [comment table_comment] [partitioned by (col_name data_type [comment col_comment], ...)] [clustered by (col_name, col_name, ...) [sorted by (col_name [asc|desc], ...)] into num_buckets buckets] [row format row_format] [stored AS file_format] [location hdfs_path]
上述字段解釋說明:

 1: create table 創建一個指定名字的表,如果相同名字的表已經存在,則拋出異常;用戶可以使用 IF NOT EXISTS來規避這個異常。

 2: external關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際數據的路徑(location)。

 3: comment為表和列添加注釋

 4: partitioned by創建分區表

 5: clustered by創建分桶表

 6: sorted by 排序

 7: row format

     delimited [fields terminated by char]

     [COLLECTION ITEMS TERMINATED BY char]

     [MAP KEYS TERMINATED BY char]

     [LINES TERMINATED BY char] | SERDE serde_name [WITHSERDEPROPERTIES(property_name=property_value,

     property_name=property_value, ...)]

  • fields terminated by char 列分隔符
  • COLLECTION ITEMS TERMINATED BY char 集合元素直接的分隔符
  • MAP KEYS TERMINATED BY char map集合KV的分隔符
  • 用戶在建表的時候可以自定義SerDe或者使用自帶的SerDe,如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe,在建表的時候,用戶還需要為表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數據。

 8:stored as指定存儲文件類型

        常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本 不指定默認)、RCFILE(列式存儲格式文件)、ORCFILE(行列壓縮存儲文件)

        如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據是二進制文件,使用 STORED AS SEQUENCEFILE,如果數據需要壓縮請使用 STORED AS RCFILE STORED AS ORCFILE

        textfile 存儲空間消耗比較大,並且壓縮的text 無法分割和合並 查詢的效率最低,可以直接存儲,加載數據的速度最高。

        sequencefile 存儲空間消耗最大,壓縮的文件可以分割和合並 需要通過text文件  轉化來加載。

        rcfile 存儲空間小,查詢的效率高 ,需要通過text文件轉化來加載,加載的速度最低

        orcfile 存儲空間最小,查詢的最高 ,需要通過text文件轉化來加載,加載的速度最低。

 9:location指定在HDFS上的存儲位置

 10:like允許用戶復制表的結構,但不復制數據。

 
        

 

#使用數據庫
use text;
#創建表
create table [if not exists] test(
     id int,
     name string,
     hobby array<string>
     address map<string,string>
)row format delimited
fileds terminated by ' '
connection items terminated by ':'
map keys terminated by '~'
#默認stored as儲存文件類型是textfile
#load加載數據(只有textfile類型的表才可以使用load)
load data local inpath '/usr/test/movies.dat' overwrite into table movie


#創建不同的文件儲存類型
create table [if not exists] test1(
     id int,
     name string,
     hobby array<string> address map<string,string> )
stored as orcfile;

#除了textfile類型的儲存方式都得用insert加載數據
insert overwrite table test1 select * from test;
 

 

 序列化器SerDe 

//創建新表 指定SerDe 為RegexpSerDe正則
use b01;
create table reg_table(
     id int,
     name string
) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties('input.regex'="id=(.*),name=(.*)"); //.代表單個字符 *  0~N次
//加載數據
load data local inpath '/usr/local/hive_data/regexp_test'  overwrite into table reg_table;

//創建user用戶數據的指定JSON的序列化器
create  table user_json_textfile(
      uid string,
      phone string,
      addr string 
) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';

load data local inpath '/usr/local/xl_project/user/user_login_info.json'  overwrite into table user_json_textfile;

 

Hive內部表&&外部表

未被external修飾的是內部表(managed table),被external修飾的為 外部表(external table)

內外部表的區別:

  • 內部表數據由Hive管理,外部表數據由HDFS管理
  • 內部表的數據的存儲位置是hive.metastore.warehouse.dir ,默認為/user/hive/warehouse中,外部表的數據存儲位置由自己指定。
  • 刪除內部表中的數據會直接刪除元數據及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的數據並不會被刪除;
  • 對內部表的修改會將修改直接同步給元數據;而對外部表的表結構和分區進行修改,則需要MSCK REPAIR TABLE table_name(將HDFS上的元數據信息寫入到metastore);   
//創建外部表
create external table outter_table(
    id int,
    name string,
    hobby array<string>,
    address map<string,string>
)row format delimited 
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/outter/data'
//向外部表中載入數據
load data local inpath '/usr/local/person' into table outter_table;

Hive表的修改操作

表重命名

Alter table 舊名稱 RENAME to 新名稱;

alter table person rename to person_info;

 

修改列信息

Alter table 表名 CHANGE [COLUMN] 列名 新列名 數據類型

[COMMENT 注釋文本]

[AFTER 字段名稱|FIRST];

//修改列名稱
alter table test1 change name tename string;
//修改列類型
alter table test1 change id id string;
//指定列位置
alter table test1 change id id string  first;

這里會遇到類型兼容的問題,看下表:

Hive數據類型之間的隱式轉換

增加列

Hive能將新的字段添加到已有字段之后

 Alter table 表名 ADD COLUMNS(

               列名 字段類型 [COMMENT ‘注釋’],

             ........

);

//增加列(可以一次添加多個)
alter table test1 add columns(
     img string,
     addr string
)

刪除或替換列 

Alter table 表名 REPLACE COLUMNS(

列名  字段類型  [COMMENT ‘注釋’],

               ............

);

//刪除替換列
alter table test1 replace columns(
     id string,
     name string,
     age string
)

修改表的存儲屬性

Alter table表名 SET FILEFORMAT (TEXTFILE|SEQUENCEFILE|RCFILE|ORCFILE)

會出現嚴重問題:(TEXTFILE的數據無法直接向RCFILE和ORCFILE導入,由於RCFILE

與ORCFILE都是以塊狀存儲數據,我們只能通過insert語句導入到一個ORCFILE或RCFILE的新表中)。快對快,行對行

//修改表的存儲結構
alter table test1 set fileformat sequencefile

設置表的注釋

alter table 表名 set tblproperties('屬性名'='屬性值');

//設置表的注釋
alter table test1 set tblproperties('comment'='測試表')

修改表的分隔符

alter table 表名 set serdeproperties('屬性名'='屬性值');

//修改表的分隔符
alter table test1 set serdeproperties('field.delim'='~')

查看表的詳細的建表語句

Show create table 表名;

//展示創建表的詳細信息
show create table test1

修改表的serde_class

//修改表的序列化器
alter table test1 set serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties ("input.regex" = "id=(.*),name=(.*),age=(.*)");

Hive添加jar包

add JAR '/usr/local/hive_data/hive-hcatalog-core-2.3.5.jar'(存放jar路徑和jar名稱)

Hive的分區操作

hive開發中,在存儲數據時,為了更快地查詢數據和更好地管理數據,都會對hive表中數據進行分區存儲。所謂的分區,在hive表中體現的是多了一個字段。而在底  層文件存儲系統中,比如HDFS上,分區則是一個文件夾,或者說是一個文件目錄,不同的分區,就是數據存放在根目錄下的不同子目錄里,可以通過show partitions查看。

 靜態分區

//創建靜態分區表
create table test_partition (
id string comment 'ID', 
name string comment '名字') 
comment '測試分區'
partitioned by (year int comment '年')
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' ;

 insert語句:

//插入分區表數據(靜態分區)
insert into table test_partition partition(year=2000) values(1,'小明');
insert into table test_partition partition(year=1999) values(2,'小紅');
insert into table test_partition partition(year=2000) values(3,'小蘭');
insert into table test_partition partition(year=1998) values(4,'小紫');

 load語句:

load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018);
load data local inpath '/usr/local/part_test' into table test_partition partition (year =2018);
load data local inpath '/usr/local/part_test' into table test_partition partition (year =2017);

 動態分區

 動態分區默認不開啟,需要使用下列語句開啟:

 set hive.exec.dynamic.partition.mode=nonstrict;#需退出hive,重新進入執行

//創建動態分區
create table test_partitions (
id string comment 'ID', 
name string comment '名字',
year int comment '年'
)comment '測試'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

 insert語句:

insert into table test_partitions partition(year) values(5,'小白',2016);
insert into table test_partitions partition(year) values(6,'小黑',2016);

 load語句:

load data local inpath '/usr/local/part_test' into table test_partitions partition (year);

修改分區

指定到新分區目錄下 原始分區仍舊存在 但是后續插入的新記錄會存儲到新分區中
alter table test_partitions partition(year=2016) set location '/user/hive/warehouse/new_part/b01.db/test_partition/year=2016';

刪除分區

alter table test_partitions drop partition(year=2016);

同步到關系型數據庫中的元信息

MSCK REPAIR TABLE test_partitions;

分桶表

分桶表描述

分桶是相對分區進行更細粒度的划分。分桶將整個數據內容安裝某列屬性值得hash值進行區分,如要安裝name屬性分為3個桶,就是對name屬性值的hash 值對3取摸,按照取模結果對數據分桶。如取模結果為0的數據記錄存放到一個文件,取模為1的數據存放到一個文件,取模為2的數據存放到一個文件。

//先設置一下分桶的權限
set hive.enforce.bucketing=true;
//
創建分桶表 use test; create table student_bck (id int, name string) clustered by (id) sorted by (id desc) into 3 buckets row format delimited fields terminated by ",";
//插入數據
insert overwrite table student_bck select id,name from test_partition;
//查詢分桶數據
select * from student_bck tablesample(bucket 3 out of 3 on id);

  tablesample (bucket x out of y on id);
  # x表示從哪個桶(x-1)開始,y代表分幾個桶,也可以理解分x為分子,y為分母,及將表分為y份(桶),取第x份(桶)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM