hive各種問題總結

 

一、hive表相關操作

需要注意的是:column alter僅僅修改table的元數據(表結構),而不會修改數據。

1、修改表名

ALTER TABLE table_name RENAME TO new_table_name;

2、增加、修改列

1)增加列

ALTER TABLE name ADD COLUMNS (

column_name1 column_type [CONMMENT column_conmment],

column_name2 column_type [CONMMENT column_conmment],

column_name3 column_type [CONMMENT column_conmment],

......

);

2)修改列

ALTER TABLE name REPLACE COLUMNS (

column_name1 column_type [CONMMENT column_conmment],

column_name2 column_type [CONMMENT column_conmment],

column_name3 column_type [CONMMENT column_conmment],

......

);

ADD COLUMNS是在當前列的末尾,分區列之前添加新的列,REPLACE COLUMNS允許用戶更新列,更新的過程是先刪除當前的列,然後在加入新的列。注:只有在使用native的SerDE時纔可以這麼做。

3、改變列名/類型/位置/註釋

ALTER TABLE table_name

CHANGE [CLOUMN]

col_old_name col_new_name column_type

[CONMMENT col_conmment]

[FIRST|AFTER column_name];

這個命令可以修改表的列名,數據類型,列註釋和列所在的位置順序,FIRST將列放在第一列,AFTER col_name將列放在col_name後面一列

4、添加、刪除分區

1)添加分區

ALTER TABLE table_name 
      ADD [IF NOT EXISTS] 
      PARTITION partition_spec [LOCATION 'location1'] 
                partition_spec [LOCATION 'location2'] ...
partition_spec: 
      (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
 

2)刪除分區

ALTER TABLE table_name DROP [IF EXISTS] partition_spec, partition_spec,...

 

 

 

二、表數據相關操作

1、Hive複製分區表和數據

1)非分區表

複製表結構: create table new_table as select * from exists_table where 1=0;

複製表結構和數據: create table new_table as select * from exists_table;

2)分區表

創建一個分區表:

create table if not exists test_table_syt
(
    id      string  COMMENT '學號',
    name    string  COMMENT '姓名',
    sex     string  COMMENT '性別'
)
COMMENT '拍賣離線10分鐘下鑽補齊10分鐘序列'
PARTITIONED BY ( dt string )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
    WITH SERDEPROPERTIES( 'field.delim' = '\t', 'serialization.null.format' = '' ) 
STORED AS 
    INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

插入數據:

insert overwrite table test_table_syt partition(dt='2018-08-16')
values ('1','張三','男'),('2','李華','女') ;

複製表:

注意差異: as select 複製的是一個非分區表, like 複製的是一個分區表。

-- 用 like 複製一個新表

create table test_tab1 like test_table_syt;

-- 用 as select 複製一個新表

create table test_tab2 as select * from test_table_syt where dt='2018-08-16' limit 0;

3)複製數據

(1)創建新表: create table test_table like test_table_syt;

(2)將HDFS的數據文件複製一份到新表目錄;

    hive cmd模式下:dfs -cp -f /user/hive/warehouse/test_table_syt/* /user/hive/warehouse/test_table/

(3)修復分區元數據信息;

    hive cmd模式下: MSCK REPAIR TABLE test_table;

2、刪除分區數據

根據分區字段p_loctype刪除分區

ALTER TABLE my_partition_test_table DROP [IF EXISTS] PARTITION (dt='2018-10-10');

 

 

 

 

 

 

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