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)

打个赏呗,您的支持是我坚持写好博文的动力
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/toto1297488504/article/details/106274542