4、Hive數據操作,DDL操作,CRUD database,CRUD table,partition,view,index,show命令等

4.1DDL操作
4.1.1Create/Drop/Alter/Use Database
4.1.1.1Create Database
4.1.1.2Drop Database
4.1.1.3Alter Database
4.1.1.4Use Database
4.1.2Create Table
4.1.2.1內部表和外部表
4.1.2.2Storage Formats
4.1.2.3Create內部表,表分區
4.1.2.4Create外部表(External Tables)
4.1.2.5 Create Table As Select (CTAS)
4.1.2.6 Create Table Like
4.1.2.7Bucketed Sorted Tables
4.1.2.8Skewed Tables
4.1.2.9Temporary Tables
4.1.2.10Transactional Tables
4.1.2.11Constraints
4.1.3Drop Table
4.1.4Truncate Table
4.1.5Alter Table
4.1.5.1Alter Table
4.1.5.2Alter Table Properties
4.1.5.3Alter Table Comment
4.1.5.4Add SerDe Properties
4.1.5.5 Alter Table Storage Properties
4.1.5.6Alter Table Skewed or Stored as Directories
4.1.5.7Alter Table Skewed
4.1.5.8Alter Table Not Skewed
4.1.5.9Alter Table Not Stored as Directories
4.1.5.10Alter Table Set Skewed Location
4.1.5.11Alter Table Constraints
4.1.6 Alter Partition
4.1.6.1Add Partitions
4.1.6.2Dynamic Partitions
4.1.6.3Rename Partition
4.1.6.4Exchange Partition
4.1.6.5 Recover Partitions (MSCK REPAIR TABLE)
4.1.6.6 Drop Partitions
4.1.6.7 (Un)Archive Partition
4.1.7 Alter Either Table or Partition
4.1.7.1 Alter Table/Partition File Format
4.1.7.2Alter Table/Partition Location
4.1.8 Alter Column
4.1.8.1Change Column Name/Type/Position/Comment
4.1.8.2 Add/Replace列
4.1.9 Create/Drop/Alter View
4.1.9.1 Create View
4.1.9.2 Drop View
4.1.9.3 Alter View的屬性
4.1.9.4 Alter View As Select
4.1.10 Create/Drop/Alter Index
4.1.10.1Create Index
4.1.10.2 Drop Index
4.1.10.3Alter Index
4.1.11Show
Show Databases
Show Tables/Views/Partitions/Indexes
Show Tables
Show Views
Show Partitions
Show Table/Partition Extended
Show Table Properties
Show Create Table
Show Indexes
Show Columns
Show Functions
Show Granted Roles and Privileges
Show Locks
Show Conf
Show Transactions
Show Compactions

4.1DDL操作

4.1.1Create/Drop/Alter/Use Database

4.1.1.1Create Database

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];

使用SCHEMA和DATABASE是可互換的,它們以爲着同一件事情。

案例:

CREATE DATABASE IF NOT EXISTS demo_db
    COMMENT 'demo'
    LOCATION '/hive/demo/demo_db'
WITH DBPROPERTIES ("name"="test demo");

hive>show databases;
OK
default
demo_db
Time taken: 0.013 seconds, Fetched: 4 row(s)
hive>

在這裏插入圖片描述

4.1.1.2Drop Database

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

案例:

hive> DROP DATABASE IF EXISTS test_database;
hive> show databases;
OK
default
demo_db
shopping
test_database
Time taken: 0.008 seconds, Fetched: 4 row(s)
hive> DROP DATABASE IF EXISTS test_database CASCADE;
hive> show databases;
OK
default
demo_db
shopping
Time taken: 0.011 seconds, Fetched: 3 row(s)
hive>

4.1.1.3Alter Database

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);   -- (Note: SCHEMA added in Hive 0.14.0)
 
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;   -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
  
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; -- (Note: Hive 2.2.1, 2.4.0 and later)

案例:

hive> ALTER DATABASE demo_db SET DBPROPERTIES ("name"="test demo db");

4.1.1.4Use Database

USE database_name;
USE DEFAULT;

案例:

hive> use demo_db;
OK
Time taken: 0.03 seconds
hive> select current_database();
OK
demo_db
Time taken: 0.148 seconds, Fetched: 1 row(s)
hive>

4.1.2Create Table

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
  [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]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
 
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];
 
data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type  -- (Note: Available in Hive 0.7.0 and later)
 
primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)
 
array_type
  : ARRAY < data_type >
 
map_type
  : MAP < primitive_type, data_type >
 
struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>
 
union_type
   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)
 
row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
 
file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
 
constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE 
通過指定表明的方式創建表,如果已經含有相同的表明,將拋出一個已經存在了的異常。你可以使用”IF NOT EXISTS”的方式跳過這個異常。
   1.表明和列名不敏感,但是SerDe和屬性名稱敏感
       A: 在Hive 0.12和更早的版本中,表名和列名中只允許字母、數字和下劃線字符
       B:在Hive 0.13和更高版本中,列名可以包含任何Unicode字符(參見Hive -6013),但是,點(.)和冒號(:)在查詢時產生錯誤,因此在Hive 1.2.0中不允許使用它們(參見Hive -10120)。在反引號(')中指定的任何列名都按字面意義處理。在反勾字符串中,使用雙反勾(' ')表示反勾字符。反引號還允許爲表和列標識符使用保留關鍵字。
       C: 要恢復到0.13.0之前的行爲,並將列名限制爲字母、數字和下劃線字符,請設置configuration屬性hive.support. quotes。標識符。在這個配置中,反勾的名稱被解釋爲正則表達式。有關詳細信息,請參見支持列名中引用的標識符。
2.表和列的註釋是字符串(單引號)
3.沒有使用EXTERNAL語句的創建的表叫內部表,因爲Hive管理它的數據。查找一個表示內部表還是外部表,可以在hive命令行窗口輸入: DESCRIBE EXTENDED table_name.的方式獲取tableType (如果tableType:EXTERNAL_TABLE,則爲外部表,如果是:tableType:MANAGED_TABLE表示是內部表)4. TBLPROPERTIES語句允許你爲表添加一些定義標籤。例如:
A: TBLPROPERTIES ("comment"="table_comment")
     B: TBLPROPERTIES ("hbase.table.name"="table_name")
     C: TBLPROPERTIES ("immutable"="true") or ("immutable"="false")
     D: TBLPROPERTIES ("orc.compress"="ZLIB")("orc.compress"="SNAPPY")("orc.compress"="NONE") 和其它的 ORC 屬性。
     E: TBLPROPERTIES ("transactional"="true")("transactional"="false")0.14.0+版本中開始支持,默認值是"false".
     F: TBLPROPERTIES ("NO_AUTO_COMPACTION"="true") or ("NO_AUTO_COMPACTION"="false"), 默認值是 "false" 
     G: TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="mapper_memory") 
     H: TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.num.threshold"="threshold_num")
     I: TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.pct.threshold"="threshold_pct") 
     J: TBLPROPERTIES ("auto.purge"="true") or ("auto.purge"="false") , 1.2.0+版本開始支持 (HIVE-9118)
     K: TBLPROPERTIES ("EXTERNAL"="TRUE") in release 0.6.0+ (HIVE-1329) –將一個內部表變成一個外部表通過將值變成"FALSE".(在hive2.4.0版本中,這個屬性值’EXTERNAL’被解析外一個布爾值,這個值爲大小寫敏感的true/false)
     L: TBLPROPERTIES ("external.table.purge"="true") in release 4.0.0+ (HIVE-19981) ,當這個屬性值被設置到外部表示,刪除表的時候將同樣將刪除數據。
5.在創建表的時候,指定一個數據庫(使用命令:USE database_name),或者通過數據庫名限定表明。(在Hive 0.7版本之後使用"database_name.table.name"的方式),“default”關鍵字可以作爲默認的數據庫。

4.1.2.1內部表和外部表

默認情況下,Hive創建的是內部表,這種表所有的文件,元數據和統計信息被Hive的內部進程管理,如果想了解更多關於內部表和外部表,可以查看https://cwiki.apache.org/confluence/display/Hive/Managed+vs.+External+Tables

4.1.2.2Storage Formats

Hive支持內置和自定義開發的文件格式。關於更多關於壓縮存儲的可以查看:https://cwiki.apache.org/confluence/display/Hive/CompressedStorage,下面是Hive中內置的一些文件格式:

Storage Format Description
STORED AS TEXTFILE 作爲純文本文件存儲. TEXTFILE是默認的文件格式, 除非 hive.default.fileformat 這個屬性有不同的.設置 /// 使用DELIMITED 子句讀取帶有分割符的文件 /// 可以使用’ESCAPED BY’ 子句來進行轉義 (例如:ESCAPED BY ‘’) /// 一個自定義 NULL 格式可以通過使用 'NULL DEFINED AS’子句指定 (默認是 ‘\N’)
STORED AS SEQUENCEFILE 以壓縮的Sequence File方式存儲。
STORED AS ORC 以 ORC 文件格式存儲. 支持ACID 事務 & Cost-based Optimizer (CBO). Stores column-level metadata.
STORED AS PARQUET 以Parquet 格式存儲 (Hive 0.13.0 及其以後版本支持); /// 在 Hive 0.10, 0.11, or 0.12版本中使用 ROW FORMAT SERDE … STORED AS INPUTFORMAT … OUTPUTFORMAT syntax …來定義
STORED AS AVRO 以Avro格式存儲(Hive 0.14.0及其以後版本)
STORED AS RCFILE 以Record Columnar File 文件格式存儲.
STORED AS JSONFILE 以Json file format文件格式存儲(Hive 4.0.0 and later及其以後版本支持)
STORED BY 以一種非本地表格式存儲. 通過create或 link到一個非本地的表, 例如由一個 HBase 或 Druid 或 Accumulo 支持的表 /// 查看更多:https://cwiki.apache.org/confluence/display/Hive/StorageHandlers
INPUTFORMAT 和 OUTPUTFORMAT 在這個文件格式中通過手工指定 InputFormat 和OutputFormat(這兩者的值爲字符串)/// 例如, ‘org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat’ /// 對於 LZO 壓縮格式, 這個值是 : ‘INPUTFORMAT “com.hadoop.mapred.DeprecatedLzoTextInputFormat” ; OUTPUTFORMAT “org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat”’
(查看更多關於 LZO 壓縮格式:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO).

4.1.2.3Create內部表,表分區

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'
STORED AS SEQUENCEFILE;

以上表的含義:分區列dt,分區列country,以SEQUENCEFILE方式存儲。數據分割符是’\001’,上面的表數據存儲在<hive.metastore.warehouse.dir>/page_view中,即在hive-site.xml中配置指定的hive.metastore.warehouse.dir 的位置中。

4.1.2.4Create外部表(External Tables)

使用EXTERNAL關鍵字能夠讓你通過指定一個LOCATION的方式創建一個表,而不使用Hive的數據默認存放位置,這種表對於已經存在數據的情況下很有幫助,當drop表的時候,使用EXTERNAL修飾的表數據將不被刪除。

如果想drop表的時候同樣刪除外部表數據,可以設置表的屬性”external.table.purge=true”

一個EXTERNAL表可以存儲在Hive的任何位置,而不僅僅是存儲在hive.metastore.warehouse.dir設置的目錄中。

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 '/hive/test/page_view';

在這裏插入圖片描述

4.1.2.5 Create Table As Select (CTAS)

這種情況下的限制是:
1.目標表不能是外部表
2.目標表不能是一個桶表

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;

上面的new_key_value_store 就是目標表,它的schema是 (new_key DOUBLE, key_value_pair STRING),它是通過SELECT語句查詢獲取到的。如果select表中沒有指定列的別名,那麼列名將被自動取爲 _col0,_col1。

4.1.2.6 Create Table Like

CREATE TABLE通過LIKE方式允許你複製一個已經存在的表(不拷貝數據)。語法格式如下:

CREATE TABLE empty_key_value_store
LIKE key_value_store [TBLPROPERTIES (property_name=property_value, ...)];

4.1.2.7Bucketed Sorted Tables

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)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS SEQUENCEFILE;

上面的例子中,表被按照userid字段分桶了(clustered by),每個桶中的數據都被按照viewTime升序存儲。

CLUSTERED BY和SORTED BY創表語句不會影響數據是如何插入的,只會影響它是怎麼讀的。這就意味着用戶必須小心翼翼的插入數據,在這個過程中指定reduce的數據量bucket的數量。在查詢的時候使用CLUSTER BY和SORT BY命令。

4.1.2.8Skewed Tables

Skewed Table可以提高有一個或多個列有傾斜值的表的性能,通過指定經常出現的值(嚴重傾斜),hive將會在元數據中記錄這些傾斜的列名和值,在join時能夠進行優化。若是指定了STORED AS DIRECTORIES,也就是使用列表桶(ListBucketing),hive會對傾斜的值建立子目錄,查詢會更加得到優化。
可以再創建表是指定爲 Skewed Table,如下例子,STORED AS DIRECTORIES是可選擇的,它指定了使用列表桶(ListBucketing)。

CREATE TABLE list_bucket_single (key STRING, value STRING)
  SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];
你也可以使用多個列創建Skewed Table,如下使用兩列。
CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
  SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

更多關於Skewed表的信息,可以查看:https://blog.csdn.net/mhtian2015/article/details/78931236

4.1.2.9Temporary Tables

臨時表只能在當前的Hive會話中被看到,數據將會被存儲在用戶的scratch目錄(hive-site.xml中指定的表中),在會話的時候將被刪除。

臨時表創建的限制條件:
1.分區列不支持。
2.不支持創建索引。

從Hive 1.1.0開始,通過使用hive.exec.temporary.table.storage 配置,臨時表的存儲策略可以被設置成 內存,ssd,或者default。具體可以參考:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html#Storage_Types_and_Storage_Policies

CREATE TEMPORARY TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING);

4.1.2.10Transactional Tables

語法是:

CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC;

4.1.2.11 Constraints

Hive支持未被驗證的主鍵和外鍵約束。當有約束是,一些SQL工具可以形成更加有效的查詢。因爲這些外鍵沒有被驗證,一些更新系統在load數據到hive的時候需要確保數據完整性。

案例:

create table pk(id1 integer, id2 integer,
  primary key(id1, id2) disable novalidate);
 
create table fk(id1 integer, id2 integer,
  constraint c1 foreign key(id1, id2) references pk(id2, id1) disable novalidate);

4.1.3Drop Table

DROP TABLE [IF EXISTS] table_name [PURGE];     -- (注意: PURGE 在 Hive 0.14.0 及其以後版本纔可用)

DROP TABLE刪除表的元數據和表的數據。如果Trash被配置了(並且PURGE沒有指定),表的數據實際上是被移動到了.Trash/Current目錄下。表的元數據完完整整的丟失了。
當刪除一個外部表的時候,存儲在文件系統中的表述就實際上是沒有被刪除的。
如果外部表的表屬性設置了external.table.purge=true,那麼數據也同樣會被刪除。

當刪除含有視圖引用的表時,不會給出任何警告(視圖將會被掛起,無效了,必須用戶刪除或重新創建)

否則,表的信息將會從metastroe中刪除,原始的表數據將會被刪除,就像是被’hadoop dfs -rm’刪除一樣。一些情況下,表中的數據被移動到他們的用戶目錄下的.Trash文件夾下。因此用戶誤刪的表數據將可以通過創建相同的schema的方式恢復,可以重新創建分區。這個過程可以通過hadoop手動的將數據移會原來的位置。

如果PURGE被指定了,表ode數據沒有進入.Trash/Current目錄。因此在誤刪除的時候不能被恢復。Purge的屬性可以通過表的屬性 ‘auto.purge’的方式設置(更多查看:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-listTableProperties)

在Hive 0.7.0及其以後版本中,如果表不存在,將會返回錯誤,除非再刪除表的時候添加IF EXISTS.或者將’ hive.exec.drop.ignorenonexistent’屬性設置成true.

4.1.4Truncate Table

TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

在表和分區中的所有的數據行都會被刪除,如果文件系統中的Trash啓動了的話,這些數據行將會被放到trash中。否則他們將會被刪除。當前這個目標表應該是native/內部表,否則將會拋出異常。

從Hive2.3.0開始,如果TBLPROPERTIES中的表屬性”auto.purge”被設置成true,表的數據將不會被移動到Trash,誤操作TRUNCATE TABLE後,數據仍然不會被找回。

4.1.5Alter Table

Alter table命令能夠允許你改變已經存在的表的結構。你可以添加列或分區,改變SerDe,添加表和SerDe屬性,或者重命名錶。
相似的,alter table partition命令允許你改變一個指定的partition的屬性值。

4.1.5.1Alter Table

ALTER TABLE table_name RENAME TO new_table_name;

通過這個命令可將原來的表明變成一個新的表明。

4.1.5.2Alter Table Properties

ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:
  : (property_name = property_value, property_name = property_value, ... )

通過上面的命令,你可以添加你自己的metadata到表上。當前的最後修改用戶,最後修改時間屬性值被自動添加到Hive中。用戶可以添加他們自己的屬性值到這個列表中。可以執行DESCRIBE EXTENDED TABLE 獲取這些信息。

4.1.5.3Alter Table Comment

想改變表的comment,你必須改變TBLPROPERTIES註釋屬性值

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

4.1.5.4Add SerDe Properties

ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
 
ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;
 
serde_properties:
  : (property_name = property_value, property_name = property_value, ... )

例如:

ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = ',');

4.1.5.5 Alter Table Storage Properties

ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
  INTO num_buckets BUCKETS;

這些statements改變表的物理存儲屬性。

4.1.5.6Alter Table Skewed or Stored as Directories

一個表的SKEWED和STORED AS DIRECTORIES選項可以通過ALTER TABLE語句來改變。

4.1.5.7Alter Table Skewed

ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
  ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]
  [STORED AS DIRECTORIES];

STORED AS DIRECTORIES 選項決定一個skewed的表是否使用list bucketing特徵,這個過程爲skewed的值創建子目錄。

4.1.5.8Alter Table Not Skewed

ALTER TABLE table_name NOT SKEWED;

NOT SKEWED選項使表變成non-skewed,並且關閉list bucketing特徵。

4.1.5.9Alter Table Not Stored as Directories

ALTER TABLE table_name NOT STORED AS DIRECTORIES;

4.1.5.10Alter Table Set Skewed Location

ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

4.1.5.11Alter Table Constraints

通過ALTER TABLE語句,表的Constraints可以被添加或remove。

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;
ALTER TABLE table_name DROP CONSTRAINT constraint_name;

4.1.6 Alter Partition

Partitions可以被添加,刪除,exchanged (moved)、drop、或者unarchived

4.1.6.1Add Partitions

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];
 
partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

例如:

ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808'
                          PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';

上面的語法是針對Hive 0.8版本的,添加多個分區的時候使用一個ALTER TABLE語句。
如果是在0.7版本,如果想修改多個分區,需要使用以下方式:

ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1';
ALTER TABLE table_name ADD PARTITION (partCol = 'value2') location 'loc2';
...
ALTER TABLE table_name ADD PARTITION (partCol = 'valueN') location 'locN';

4.1.6.2Dynamic Partitions

分區可以動態的添加到一個表中,使用Hive的INSERT語句。通過下面的連接地址查看更多的detail和例子:

Design Document for Dynamic Partitions:https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions
Tutorial: Dynamic-Partition Insert:https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-Dynamic-PartitionInsert
Hive DML: Dynamic Partition Inserts:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-DynamicPartitionInserts
HCatalog Dynamic Partitioning:https://cwiki.apache.org/confluence/display/Hive/HCatalog+DynamicPartitions

4.1.6.3Rename Partition

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

4.1.6.4Exchange Partition

分區可以在表之間進行交換,

-- 將分區從 table_name_1 移動到 table_name_2 表
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1;
-- 多分區
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;
Exchange Partition允許你將一個表的分區到另外一個表中,能夠做這種交換的前提是擁有相同的schema並且沒有這個分區。

4.1.6.5 Recover Partitions (MSCK REPAIR TABLE)

hive在元數據中保存着分區信息,如果直接用 hadoop fs -put 命名在HDFS上添加分區,元數據不會意識到。

需要用戶在hive上爲每個新分區執行ALTER TABLE table_name ADD PARTITION,元數據纔會意識到。

用戶可以用元數據檢查命令修復表,它會添加新分區的元數據信息到hive的元數據中。換句話說,這個命令會把HDFS上有的分區,但是元數據中沒有的分區,補充到元數據信息中。

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];

4.1.6.6Drop Partitions

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
  [IGNORE PROTECTION] [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)

你可以使用ALTER TABLE DROP PARTITION來drop一個表中的一個分區。浙江刪除分區的元數據信息和數據。如果Trash設置了的話,數據實際上是被移動到.Trash/Current目錄中。除非指定了PURGE,否則表的metadata將被完完整整的丟失。

如果PURGE指定了,刪除了的分區信息將不會進入.Trash/Current目錄,因此不能恢復錯誤Drop操作的刪除的數據。

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec PURGE;     -- (Note: Hive 1.2.0 and later)

在TBLPROPERTIES中同樣可以設置purge選項,它的值是’ auto.purge’.
在Hive 0.7.0及其後續版本,如果分區不存在,刪除的時候將會返回error,除非IF EXISTS指定了或者在配置變量裏面加上” hive.exec.drop.ignorenonexistent ”,並設置值爲true。

例如:

ALTER TABLE page_view DROP PARTITION (dt='2008-08-08', country='us');

4.1.6.7(Un)Archive Partition

ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;

Archiving 是移動一個分區文件到hadoop Archive(HAR)的過程。注意只有文件數量將會被減少;HAR不提供任何的壓縮。關於Archiving的相關信息可以查看:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Archiving

4.1.7Alter Either Table or Partition

4.1.7.1Alter Table/Partition File Format

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

改語句改變表或分區的文件格式, file_format的可選值有:TEXTFILE,SEQUENCEFILE,ORC,PARQUET,AVRO,RCFILE,JSONFILE等。這個操作只會改變表的元數據數據。任何現有數據的改變都必須在表外進行改變。

4.1.7.2Alter Table/Partition Location

ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";

4.1.8 Alter Column

在Hive 0.12.0及其以前版本,列名只能包含字母和下劃線。
在Hive 0.13.0及其以後版本,默認情況下,列名可以使用反引號 () 來引用,並且可以包含任何Unicode的字符串。但是點(.) 和冒號 (:) 在查詢的時候產生錯誤。在 () 裏面,除了 (``) 表示一個引號之外,其它的字母都是其原本本的含義。
反引號允許對列名和表名使用保留關鍵字。

4.1.8.1Change Column Name/Type/Position/Comment

改變列名/類型/Position/註釋的語法如下:

ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
  [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];

上面的命令允許你改變列名,數據類型,註釋,或者position,再或者他們之間任意的組合,PARTITION子句在Hive0.14.0之後可用的。CASCADE|RESTRICT子句在Hive 1.1.0開始被允許。帶有CASCADE的ALTER TABLE CHANGE COLUMN改變表的元數據中的列,同樣改變所有的分區元數據。RESTRICT是默認值,只改變表的元數據。
注意:ALTER TABLE CHANGE COLUMN CASCADE子句將重寫表分區列的元數據,而不管表或分區的保護模式,請謹慎使用。

列的改變只會改變Hive的元數據,不會改變數據。

案例:

CREATE TABLE test_change (a int, b int, c int);

// 將列名 a 的名字改成  a1.
ALTER TABLE test_change CHANGE a a1 INT;

在這裏插入圖片描述

//將a1列改成a2,將數據的類型改成string的, 並將它放到b列的後面.
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;

在這裏插入圖片描述

//爲列a1添加註釋
ALTER TABLE test_change CHANGE a2 a2 STRING COMMENT 'this is column a2';

4.1.8.2 Add/Replace列

ALTER TABLE table_name 
  [PARTITION partition_spec]                 -- (注意: Hive 0.14.0 及其以後版本支持)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]                         -- (注意: Hive 1.1.0 及其以後版本支持)
    ADD COLUMNS 的時候,新列將在已經存在的列的後面,但是在分區列的前面。
REPLACE COLUMNS的作用是,刪除已經存在的列,添加新的列。REPLACE COLUMNS也可以用於刪除列,例如:” ALTER TABLE test_change REPLACE COLUMNS (b int,a2 string);” 將刪除test_change表中的c列。

在這裏插入圖片描述
在這裏插入圖片描述

4.1.9 Create/Drop/Alter View

4.1.9.1 Create View

創建視圖的語法如下:

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT ...;

注意:視圖只能被讀,不能使用LOAD/INSERT/ALTER。

案例:

CREATE VIEW onion_referrers(url COMMENT 'URL of Referring page')
  COMMENT 'Referrers to The Onion website'
  AS
  SELECT DISTINCT referrer_url
  FROM page_view
  WHERE page_url='http://www.theonion.com';

在這裏插入圖片描述
在這裏插入圖片描述

4.1.9.2 Drop View

語法:

DROP VIEW [IF EXISTS] [db_name.]view_name;

案例:

DROP VIEW onion_referrers;

在這裏插入圖片描述

4.1.9.3 Alter View的屬性

ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;
 
table_properties:
  : (property_name = property_value, property_name = property_value, ...)
例如:
ALTER VIEW onion_referrers SET TBLPROPERTIES ('userName' = 'zhangsan');

4.1.9.4 Alter View As Select

ALTER VIEW [db_name.]view_name AS select_statement;

例子:

hive> ALTER VIEW onion_referrers AS select referrer_url,ip from page_view;
OK
Time taken: 0.188 seconds
hive> show create table onion_referrers;
OK
CREATE VIEW `onion_referrers` AS select `page_view`.`referrer_url`,`page_view`.`ip` from `demo_db`.`page_view`
Time taken: 0.076 seconds, Fetched: 1 row(s)
hive> desc onion_referrers;
OK
referrer_url        	string              	                    
ip                  	string              	                    
Time taken: 0.104 seconds, Fetched: 2 row(s)
hive>

4.1.10 Create/Drop/Alter Index

關於Hive Indexes的文檔,可以參考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Indexing
Index的設計文檔:https://cwiki.apache.org/confluence/display/Hive/IndexDev

4.1.10.1Create Index

索引是標準的數據庫技術,hive 0.7版本之後支持索引。hive索引採用的不是’one size fites all’的索引實現方式,而是提供插入式接口,並且提供一個具體的索引實現作爲參考。

hive索引具有以下特點:
1.索引key冗餘存儲,提供基於key的數據視圖
2.存儲設計以優化查詢&檢索性能
3.對於某些查詢減少IO,從而提高性能。

CREATE INDEX index_name
  ON TABLE base_table_name (col_name, ...)
  AS index_type
  [WITH DEFERRED REBUILD]
  [IDXPROPERTIES (property_name=property_value, ...)]
  [IN TABLE index_table_name]
  [
     [ ROW FORMAT ...] STORED AS ...
     | STORED BY ...
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (...)]
  [COMMENT "index comment"];

注意:
1.index的partition默認和數據表一致
2.視圖上不能創建index
3.index可以通過stored as配置存儲格式。

4.1.10.2 Drop Index

語法:

DROP INDEX [IF EXISTS] index_name ON table_name;

4.1.10.3Alter Index

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

4.1.11Show

Show可做的操作有
Show Databases
Show Tables/Views/Partitions/Indexes
Show Tables
Show Views
Show Partitions
Show Table/Partition Extended
Show Table Properties
Show Create Table
Show Indexes
Show Columns
Show Functions
Show Granted Roles and Privileges
Show Locks
Show Conf
Show Transactions
Show Compactions

4.1.11.1Show Databases

語法:

SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards'];

其中like用於過濾,例如:

hive> show databases;
OK
default
demo_db
shopping
Time taken: 0.016 seconds, Fetched: 3 row(s)
hive> show databases like "demo*|shop*g";
OK
demo_db
shopping
Time taken: 0.013 seconds, Fetched: 2 row(s)
hive>

4.1.11.2 Show tables

語法:

SHOW TABLES [IN database_name] ['identifier_with_wildcards'];

案例:

hive> use demo_db;
OK
Time taken: 0.028 seconds
hive> select current_database();
OK
demo_db
Time taken: 0.273 seconds, Fetched: 1 row(s)
hive> show tables;
OK
fk
onion_referrers
page_view
pk
test_change
test_serializer
Time taken: 0.085 seconds, Fetched: 6 row(s)
hive> show tables in shopping;
OK
Time taken: 0.066 seconds
hive> show tables in demo_db like '*test*';
OK
test_change
test_serializer
Time taken: 0.06 seconds, Fetched: 2 row(s)
hive>

4.1.11.3 Show views

語法:

SHOW VIEWS [IN/FROM database_name] [LIKE 'pattern_with_wildcards'];

案例:

SHOW VIEWS;                                -- 顯示當前database下的所有的view
SHOW VIEWS 'test_*';                       -- 顯示所有的以"test_"開頭的view
SHOW VIEWS '*view2';                       -- 顯示所有以"view2"結尾的view
SHOW VIEWS LIKE 'test_view1|test_view2';   -- 顯示"test_view1" 或 "test_view2"視圖
SHOW VIEWS FROM test1;                     -- 從database test1中查找視圖
SHOW VIEWS IN test1;                       -- 從database test1中查找視圖
SHOW VIEWS IN test1 "test_*";              -- 顯示所有在database test2 中以 "test_"開頭的視圖

4.1.11.4 Show Partitions

語法:

SHOW PARTITIONS table_name;

案例:

SHOW PARTITIONS table_name PARTITION(ds='2010-03-03');            -- (Note: Hive 0.6 and later)
SHOW PARTITIONS table_name PARTITION(hr='12');                    -- (Note: Hive 0.6 and later)
SHOW PARTITIONS table_name PARTITION(ds='2010-03-03', hr='12');   -- (Note: Hive 0.6 and later)

4.1.11.5 Show Table/Partition Extended

語法案例:

SHOW TABLE EXTENDED [IN|FROM database_name] LIKE 'identifier_with_wildcards' [PARTITION(partition_spec)];

案例:

hive> show table extended like 'test*'> ;
OK
tableName:test_change
owner:root
location:hdfs://hadoop1:9000/hive/demo/demo_db/test_change
inputformat:org.apache.hadoop.mapred.TextInputFormat
outputformat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
columns:struct columns { i32 b, string a2}
partitioned:false
partitionColumns:
totalNumberFiles:0
totalFileSize:0
maxFileSize:0
minFileSize:0
lastAccessTime:0
lastUpdateTime:1559095998866

tableName:test_serializer
owner:root
location:hdfs://hadoop1:9000/hive/demo/demo_db/test_serializer
inputformat:org.apache.hadoop.mapred.TextInputFormat
outputformat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
columns:struct columns { string string1, i32 int1, byte tinyint1, i16 smallint1, i64 bigint1, bool boolean1, float float1, double double1, list<string> list1, map<string,i32> map1, struct<sint:i32,sboolean:bool,sstring:string> struct1, uniontype<float,bool,string> union1, string enum1, i32 nullableint, binary bytes1, binary fixed1}
partitioned:false
partitionColumns:
totalNumberFiles:0
totalFileSize:0
maxFileSize:0
minFileSize:0
lastAccessTime:0
lastUpdateTime:1559003554642

Time taken: 0.063 seconds, Fetched: 30 row(s)
hive>

4.1.11.6 Show Table Properties

語法:

SHOW TBLPROPERTIES tblname;
SHOW TBLPROPERTIES tblname("foo");

案例:

hive> show tblproperties test_change;
OK
COLUMN_STATS_ACCURATE	{"BASIC_STATS":"true"}
last_modified_by	root
last_modified_time	1559097354
numFiles	0
numRows	0
rawDataSize	0
totalSize	0
transient_lastDdlTime	1559097354
Time taken: 0.058 seconds, Fetched: 8 row(s)
hive>

4.1.11.7 Show Create Table

SHOW CREATE TABLE ([db_name.]table_name|view_name);

案例:
在這裏插入圖片描述

4.1.11.8 Show Columns

語法:

SHOW COLUMNS (FROM|IN) table_name [(FROM|IN) db_name];

案例:

hive> show columns from test_change;
OK
b                   
a2                  
Time taken: 0.072 seconds, Fetched: 2 row(s)
hive>

4.1.11.9 Show Functions

顯示Function

hive> SHOW FUNCTIONS "a.*";
SHOW FUNCTIONS is deprecated, please use SHOW FUNCTIONS LIKE instead.
OK
abs
acos
add_months
aes_decrypt
aes_encrypt
and
array
array_contains
ascii
asin
assert_true
atan
avg
Time taken: 0.005 seconds, Fetched: 13 row(s)
hive>

4.1.12 Describe

4.1.12.1Describe Database

語法:

DESCRIBE DATABASE [EXTENDED] db_name;
DESCRIBE SCHEMA [EXTENDED] db_name;     -- (Note: Hive 1.1.0 and later)

4.1.12.2Describe Table/View/Column

DESCRIBE [EXTENDED | FORMATTED]
    [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];

4.1.12.3 Describe Partition

hive> show partitions part_table;
OK
d=abc
 
 
hive> DESCRIBE extended part_table partition (d='abc');
OK
i                       int                                        
d                       string                                     
                  
# Partition Information         
# col_name              data_type               comment            
                  
d                       string                                     
                  
Detailed Partition Information  Partition(values:[abc], dbName:default, tableName:part_table, createTime:1459382234, lastAccessTime:0, sd:StorageDescriptor(cols:[FieldSchema(name:i, type:int, comment:null), FieldSchema(name:d, type:string, comment:null)], location:file:/tmp/warehouse/part_table/d=abc, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), parameters:{numFiles=1, COLUMN_STATS_ACCURATE=true, transient_lastDdlTime=1459382234, numRows=1, totalSize=2, rawDataSize=1})  
Time taken: 0.325 seconds, Fetched: 9 row(s)
 
 
hive> DESCRIBE formatted part_table partition (d='abc');
OK
# col_name              data_type               comment            
                  
i                       int                                        
                  
# Partition Information         
# col_name              data_type               comment            
                  
d                       string                                     
                  
# Detailed Partition Information                
Partition Value:        [abc]                   
Database:               default                 
Table:                  part_table              
CreateTime:             Wed Mar 30 16:57:14 PDT 2016    
LastAccessTime:         UNKNOWN                 
Protect Mode:           None                    
Location:               file:/tmp/warehouse/part_table/d=abc    
Partition Parameters:           
        COLUMN_STATS_ACCURATE   true               
        numFiles                1                  
        numRows                 1                  
        rawDataSize             1                  
        totalSize               2                  
        transient_lastDdlTime   1459382234         
                  
# Storage Information           
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe      
InputFormat:            org.apache.hadoop.mapred.TextInputFormat        
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat      
Compressed:             No                      
Num Buckets:            -1                      
Bucket Columns:         []                      
Sort Columns:           []                      
Storage Desc Params:            
        serialization.format    1                  
Time taken: 0.334 seconds, Fetched: 35 row(s)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章