Hive列操作匯總(添加/更新/刪除/虛擬列)


官網語法如下所示
https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-AlteringandDroppingTables

***注意:***REPLACE列 替換所有現有列,只更改表的模式,而不是數據。表必須使用本機SerDe。REPLACE列 還可以用於從表的模式中刪除列.

添加字段

一次增加一個列(默認添加為最后一列)
ALTER TABLE table_name ADD COLUMNS (new_col INT); 
可以一次增加多個列
ALTER TABLE table_name ADD COLUMNS (c1 INT,c2 STRING); 
添加一列並增加列字段注釋
ALTER TABLE table_name ADD COLUMNS (new_col INT COMMENT 'a comment');

改變列名/類型/位置/注釋

ALTER TABLE table_name CHANGE
    [CLOUMN] col_old_name col_new_name column_type
    [CONMMENT col_conmment]
    [FIRST|AFTER column_name]
    [CASCADE|RESTRICT];

該命令將允許用戶更改列的名稱、數據類型、注釋、位置或它們的任意組合,但必須先存在該字段才能修改名字及指定位置.

列更改命令只修改Hive的元數據,不修改數據。用戶應該確保表/分區的實際數據布局符合元數據定義。

無論表或分區的保護模式如何,ALTER TABLE CHANGE COLUMN CASCADE子句都將覆蓋表分區的列元數據。使用自由裁量權。

// 首先將列a的名稱更改為a1:
ALTER TABLE test_change CHANGE a a1 INT;
 
//將列a1的名稱更改為a2,將其數據類型更改為字符串,並將其放在列b之后:
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
注意:列位置更換后數據位置還是不動的,若想讓數據跟着字段一起移動,需更新表數據,
使用insert overwrite table 從表中將移動之前對應的數據插入到移動之后對應的字段中

// 新表的結構是: 
 b int, a2 string, c int.
 
// 然后將c列的名稱改為c1,並將其作為第一列:
ALTER TABLE test_change CHANGE c c1 INT FIRST;

// 此時新表的結構是: 
 c1 int, b int, a2 string.

添加/更新列

ALTER TABLE table_name 
  [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]                         -- (Note: Hive 1.1.0 and later)

添加列允許您在現有列的末尾,但在分區列之前添加新列。對於Avro支持的表、Hive 0.14和更高版本,也支持這種方法。
REPLACE列刪除所有現有列並添加新的列集。這只能用於具有本機SerDe的表(DynamicSerDe、元數據類型pedcolumnsetserde、LazySimpleSerDe和ColumnarSerDe)。REPLACE列還可以用於刪除列。


刪除列示例:

   原有Hive表test_change中有a,b,c,d,e這幾個字段
   將從test_change中刪除“d”列:
     ALTER TABLE test_change REPLACE COLUMNS (a int, b int,c string,e string);
   將d和e兩列一起刪除:
      ALTER TABLE test_change REPLACE COLUMNS (a int, b int,c string);

注意:如果列字段比較多,可以用show create table table_name; 顯示建表語句,將字段一次性復制進來,刪除哪些字段就直接去除即可.

 

Hive表中的虛擬(隱藏)列:
在hive中直接可以直接使用的列,無需創建

INPUT__FILE__NAME:   maptask中的輸入文件
BLOCK__OFFSET__INSIDE__FILE:   記錄在文件中的偏移量

示例:

SELECT  carid,
    carbrand,
    INPUT__FILE__NAME ,
    BLOCK__OFFSET__INSIDE__FILE 
from test.car_info
ORDER BY carid desc
limit 50;

 

 該虛擬列可用於查找數據在hdfs文件系統對應的存儲路徑及偏移量


免責聲明!

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



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