一、HiveQL是什么?


1.HiveQL概述


Hive是一种数据仓库分析系统,前面我们也说到过,它主要是将SQL的查询过程通过MapReduce来完成


HiveQL本质上就是一种SQL。Hive通过HiveSQL去查询分析需要的内容,使不熟悉MapReduce的用户也可以很方便的利用SQL来查询、汇总并分析数据。


2.HiveQL及Hive的特点


(1)与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。


(2)Hive不适合用于联机,也不提供实时查询功能。


它最适合应用在基于大量不可变数据的批处理作业。如HiveQL不支持更新操作, 也不支持索引和事务, 它的子查询和join操作也很局限, 这是因其底层依赖于Hadoop平台这决定的, 但其有些特点是SQL所无法企及的。


(3)Hive具有可伸缩性,支持Hadoop集群上动态的添加设备,可拓展和容错等特点


 


下面对常用操作进行简单介绍:


 


二、创建表和删除表


1.创建表


CREATE [①TEMPORARY][②EXTERNAL] TABLE [③IF NOT EXISTS][database_name] table_name 
    [(col_name data_type)[⑨COMMENT col_comment],...[constraint_sepecification]]
    [COMMENT table_comment]
    [④PARTITIONED BY (col_name data_type)[COMMENT col_comment],...)]
    [⑤CLUSTERED BY (col_name1,col_name2,...) [⑩SORTED BY (col_name[ASC|DESC],...)] INTO num_buckets BUCKETS]
    [SKEWED BY (col_name,col_name,...)]
        ON ((col_value,col_value,...),(col_value,col_value,...),...)
        [STORED AS DIRECTORIES]
    [
    [⑥ROW FORMAT row_format]
    [⑦STORED AS file_format]
        | STORED BY '' [WITH SERDEPROPERTIES(...)]
    ]
    [LOCATION hdfs_path]
    ......(更多的参数可参见官方文档)

CREATE [TEMPORARY][EXTERNAL] TABLE [IF NOT EXISTS][database_name] table_name
    ⑧LIKE existing_table_or_view_name
    [LOCATION hdfs_path]

下面对关键字进行解释


①TEMPORARY


创建临时表,临时表只对当前的session生效一次,session结束后该表自动删除。


注意:不支持分区字段和创建索引。


 


②EXTERNAL


创建外部表,在建表的同时制定一个指向实际数据的路径(LOCATION),创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,外部表只删除元数据,不删除数据。


配合LOCATION hdfs_name使用


 


③IF NOT EXISTS


创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常。


 


④PARTITIONED BY


一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。


 


⑤CLUSTERED BY


分桶;分桶有两个理由,第一个是查询效率更高,第二个是取样更高效。


物理上,每个桶就是表或分区中的一个文件,桶的每个文件对应于MapReduce的输出分区。


 


⑥ROW FORMAT


是用来设置创建的表在加载数据的时候,支持的列分隔符。


 


⑦STORED AS


[STORED AS file_format]


用于 指定hive存储的文件格式(在前一节有提及)。一般是结合[ROW FORMAT]使用。


 


⑧LIKE


借助以已存在的表, 创建一张空表


 


⑨COMMENT


给语句注释的作用


 


⑩SORTED BY


指定按照哪一列进行排序。


 


CATS


create table person2 as select * from person;


在创建表的同时插入数据,生成一张新表。


 


2.删除表


(1)删除表


[DROP TABLE table_name]


    表删除包括表的定义和关联对象(规则、索引、约、触发器、主键,等)。很明显,一旦表被删除,那么表中包含的所有的数据行都会被一同删除。   


(2)截断表


[TRUNCATE TABLE table_name]


    truncate 命令则仅仅删除了表中所有的数据行。表的结构和所有的索引仍然继续存在,绑定到列上的规则、默认值、约束仍然继续绑定,并且触发器也仍然起作用。直到你输入删除表的命令(如上所述)。


 


三、修改表


1.重命名表


ALTER TABLE table_name RENAME TO new_table_name;


 


2.修改表的属性


ALTER TABLE table_name SET TBLPROPERTIES table_properties;


修改表注释、修改表serde的列分隔符、修改表的sede等


 


3.修改表的分区:


(1)新增分区


ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION 指定分区 [LOCATION ‘location1’];

(2)重命名分区ALERT TABLE(将table指定放入分区)

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION 指定分区 [LOCATION ‘location1’];

(3)自动恢复分区(让系统自动根据目录结构进行分区划分)MSCK


MSCK REPAIR TABLE table_name;

(4)删除分区


ALTER TABLE table_name DROP [IF EXISTS] PARTITION 指定分区(例:(y='WT0228',m='201501'));

4.修改列名change colname


ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_oldname col_newname col_type
    [COMMENT col_col_comment];

5.添加列或者替换列


ALTER TABLE TABLE_NAME table_name
    ADD|REPLACE COLUMNS(col_name data_type,......)

四、视图


1.Hive中的视图功能特点:


(1)只有逻辑视图,没有物化视图(也就是物理表,物化视图本身会存储数据)


(2)视图只能查询,不能Load/Insert/Update/Delete数据


(3) 视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询;


 


2.对视图的操作


(1)创建


CREATE VIEW [IF NOT EXISTS] [db_name.] 
    AS SELECT ...;

(2)修改


ALTER VIEW [db_name.] view_name SET TBLPROPERTIES table_properties;

(3)删除


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

五、索引


(1)创建


CREATE INDEX index_name
    ON TABLE base_table_name
    AS index_type;

(2)删除


DROP INDEX [IF EXISTS] index_name ON table_name;

(3)修改


ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

六、显示信息


1.列出所有的库


SHOW DATABASES ;


 


2.列出库下所有的表


SHOW TABLES IN database_name;


 


3.列出所有的视图


SHOW VIEWS [IN/FROM database_name]


 


4.列出表分区


SHOW PARTITION table_name;


 


5.显示索引


SHOW (INDEX|INDEXES) ON table_with_index [ (FROM|IN) db_name]; 


 


6.显示表的所有列信息


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


 


7.显示Function(自定义的函数)信息


SHOW FUNCTIONS "a.*";


 


8.显示锁表(给表加读写权限)的信息


SHOW LOCKS <table_name>


 


七、用户自定义函数 UFD


Hive中有三种UDF


1.UDF:


操作于单个数据行,一对一的转换


2.UDAF:


聚集函数接受多个输入数据,产生几个输出函数


自定义实现UDAF是继承实现UDAF类。


将jar包加到hive的服务器,创建function


3.UDTF:


一行数据转换为多行数据使用的函数