hive 表結構操作

2021-09-01 18:16:26 字數 3823 閱讀 1499

簡單的建立表

create table table_name (

id int,

dtdontquery string,

name string

)

建立有分割槽的表

create table table_name (

id int,

dtdontquery string,

name string

)partitioned by (date string)

乙個表可以擁有乙個或者多個分割槽,每個分割槽以資料夾的形式單獨存在表資料夾的目錄下。

分割槽是以字段的形式在表結構中存在,通過describe table命令可以檢視到字段存在,但是該字段不存放實際的資料內容,僅僅是分割槽的表示。

在hive select查詢中一般會掃瞄整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃瞄表中關心的一部分資料,因此建表時引入了partition概念。表中的乙個 partition 對應於表下的乙個目錄,partition 就是輔助查詢,縮小查詢範圍,加快資料的檢索速度和對資料按照一定的規格和條件進行管理。

典型的預設建立表

create table page_view(

viewtime int,

userid bigint,

page_url string,

referrer_url string,

ip string comment 'ip address of the user')

comment 'this is the page view table'

partitioned by(dt string, country string)

row format delimited

fields terminated by '\001'

collection items terminated by '\002'

map keys terminated by '\003'

stored as textfile;

這裡建立了表page_view,有表的注釋,乙個欄位ip的注釋,分割槽有兩列,分別是dt和country。

[row format delimited]關鍵字,是用來設定建立的表在載入資料的時候,支援的列分隔符。不同列之間用乙個'\001'分割,集合(例如array,map)的元素之間以'\002'隔開,map中key和value用'\003'分割。

[stored as file_format]關鍵字是用來設定載入資料的資料型別,預設是textfile,如果檔案資料是純文字,就是使用 [stored as textfile],然後從本地直接拷貝到hdfs上,hive直接可以識別資料。

常用的建立表

create table login(

userid bigint,

ip string,

time bigint)

partitioned by(dt string)

row format delimited

fields terminated by '\t'

stored as textfile;

建立外部表

如果資料已經存在hdfs的'/user/hadoop/warehouse/page_view'上了,如果想建立表,指向這個路徑,就需要建立外部表:

create external table page_view(

viewtime int,

userid bigint,

page_url string,

referrer_url string,

ip string comment 'ip address of the user',

country string comment 'country of origination')

comment 'this is the staging page view table'

row format delimited fields terminated by '\054'

stored as textfile

location '/user/hadoop/warehouse/page_view';

建立表,有指定external就是外部表,沒有指定就是內部表,內部表在drop的時候會從hdfs上刪除資料,而外部表不會刪除。

外部表和內部表一樣,都可以有分割槽,如果指定了分割槽,那外部表建了之後,還要修改表新增分割槽。

外部表如果有分割槽,還可以載入資料,覆蓋分割槽資料,但是外部表刪除分割槽,對應分割槽的資料不會從hdfs上刪除,而內部表會刪除分割槽資料。

指定資料庫建立表

如果不指定資料庫,hive會把表建立在default資料庫下,假設有乙個hive的資料庫mydb,要建立表到mydb,如下:

create table mydb.pokes(foo int,bar string);
或者是

use mydb; --把當前資料庫指向mydb

create table pokes(foo int,bar string);
複製表結構

create table empty_table_name like table_name;
根據table_name建立乙個空表empty_table_name,empty_table_name沒有任何資料。

create-table-as-selectt (ctas)
ctas建立的表是原子性的,這意味著,該錶直到所有的查詢結果完成後,其他使用者才可以看到完整的查詢結果表。

ctas唯一的限制是目標表,不能是乙個有分割槽的表,也不能是外部表。

簡單的方式

create table new_key_value_store

as select (key % 1024) new_key, concat(key, value) key_value_pair from key_value_store;

複雜的方式

create table new_key_value_store

row format serde "org.apache.hadoop.hive.serde2.columnar.columnarserde"

stored as rcfile as

select (key % 1024) new_key, concat(key, value) key_value_pair

from key_value_store

sort by new_key, key_value_pair;

刪除表

drop table table_name;

drop table if exists table_name;

刪除表會移除表的元資料和資料,而hdfs上的資料,如果配置了trash,會移到.trash/current目錄下。

刪除外部表時,表中的資料不會被刪除。

截斷表

truncate table table_name;

truncate table table_name partition (dt='20080808');

從表或者表分割槽刪除所有行,不指定分割槽,將截斷表中的所有分割槽,也可以一次指定多個分割槽,截斷多個分割槽。

hive 修改表結構

在工作中,有時候會遇到老表的資料已經不能支援新的業務需求,若是重新建立乙個表來承載,稍微麻煩,若是用舊表來寫資料,就需要對舊表做調整。下面的內容就是介紹如何對hive表結構做修改 alter table old table rename to new table 修改字段,同時需要指明字段型別 al...

Hive操作表分割槽

建立分割槽表語句,使用關鍵字partition a 單分割槽建表語句 create table table name id int,content string partitioned by dt string 單分割槽表,按天分割槽,在表結構增加了dt列。以dt為資料夾區分 b 雙分割槽建表語句 ...

常用Hive表操作

一 hive建表語句 create table if not exists test id int,name string,age int 預設底層儲存為文字檔案,且為預設分隔符 create table if not exists test id int,name string,age int r...