HiveQL:数据定义
-
Hive中的数据库
Hive中数据库本质为表的一个目录或者命名空间
建库:
hive> CREATE DATABASE [IF NOT EXISTS] finacials;
Hive会为每个数据库创建一个目录,数据库中的表将会以这个数据库目录的子目录形式存储。例外:default数据库 --》 default数据库本身没有自己的目录。
数据库所在目录位于属性hive.metastore.warehouse.dir 所指定的顶层目录之后
数据库文件目录以.db结尾
举例, 创建数据库financials ==》 hive对应创建目录/user/hive/warehouse/financials.db
修改数据库默认位置
hive > CREATE DATABASE financials > LOCATION '/my/preferred/directory';
增加描述信息,并查询
hive > CREATE DATABASE financials > COMMENT 'Holds all financial tables'; hive > DESCRIBE DATABASE financials; financials Holds all financial tables hdfs://master-server/user/hive/warehouse/financials.db
master-server 代表URL权限 -- “主节点”(Namenode)+ 可选端口号
Hive将会使用Hadoop配置文件中的配置项fs.default.name作为master所对应的服务器名和端口号,这个配置文件可以在$HADOOP_HOME/conf目录下找到
hdfs:///user/hive/warehouse/financials.db和hdfs://master-server/user/hive/warehouse/financials.db等价
其中master-server是主节点的DNS名和可选端口号
备注:
为了保持完整性,当用户指定一个相对路径时,对于HDFS和Hive都会将这个相对路径放到分布式文件系统的指定根目录下。然而,如果用户是在本地模式下执行的话,那么当前的本地工作目录将是相对目录的父目录。
为了可移植性,通常省略服务器和端口号信息,只有涉及另一个分布式文件系统实例时才会指明该信息。
为数据中增加键值对属性信息
hive > CREATE DATABASE financials > WITH DBPROPERTIES ('creator'='Mark', 'date'='2012-01-02'); hive > DESCRIBE DATABASE financials; financials hdfs://master-server/user/hive/warehouse/financials.db hive > DESCRIBE DATABASE EXTENDED financials; financials hdfs://master-server/user/hive/warehouse/financials.db {date=2012-01-02, creator=Mark};
USE -> 切换用户当前工作数据库
hive > USE financials;
备注:
没有命令可以让用户查看当前工作数据库,无嵌套数据库概念 --》 可重复使用USE
删除数据库
hive > DROP DATABASE [IF EXISTS] financials;
备注:
默认情况下,Hive不允许用户删除一个包含有表的数据库。用户要么先删除数据库中的表,然后再删除数据库,要么在数据命令的最后面加上关键字CASCADE,这样Hive可以自行先删除数据库中表。
hive > DROP DATABASE IF EXISTS financials CASCADE;
使用RESTRICT关键字与默认情况一致。如果某个数据库被删除,那么其对应的目录也同时会被删除。
修改数据库(没有办法删除或“重置”数据库属性)
hive > ALTER DATABASE financials SET DBPROPETIES ('edited-by'='Joe')
-
表
创建表
CREATE TABLE [IF NOT EXISTS] xxx_db.xxx(...) COMMENT '' TBLPROPERTIES('') LOCATION ' ' ;
大多数情况下,TBLPROPERTIES主要作用是按键-值对的格式为表增加额外的文档的说明。
Hive会自动增加两个表属性:一个是last_modified_by,其保存着最后修改这个表的用户的用户名;一个是last_modified_time,其保存着最后一次修改的新纪元时间秒
默认情况下,Hive总是将创建的表的目录放置在这个表所属的数据库目录之后。(pl:/user/hive/warehouse/mydb.db/employees)
default数据库是个意外,其在/user/hive/warehouse无目录,其表直接位于/user/hive/warehouse目录之后
拷贝表格式
CREATE TABLE IF NOT EXISTS XXX_db.XXX2 LIKE XXX_db.XXX;
显示表信息
SHOW TABLES [IN DB]; DESCRIBE EXTENDED|FORMATTED XXX_db.XXX[.colXXX];
管理表与外部表
管理表 -> Hive控制着数据声明周期,默认情况下Hive会将这些表存储在配置项hive.metastore.warehouse.dir定义的目录的子目录下。[pl: 删除一张管理表,Hive会删除表中的数据]
由于读时模式,Hive事实上没有给用户管理管理表的能力
外部表 ->
CREATE EXTERNEL TABLE [IF NOT EXISTS] ...
关键字EXTERNEL告诉Hive这个表是外部的,由于表是外部的,Hive并非认为其完全拥有这份数据。因此删除该表时并不会删除这份数据,描述表的元数据信息会被删除。
分区
分区管理表与外部分区表
Hive中创建好可以反映分区结构的子目录 pl:
hdfs://master_server/user/hive/warehouse/mydb.db/employees
备注:
执行一个包含所有分区的查询可能会触发一个巨大的MapReduce任务,可以通过将Hive设置为“strict”模式,这样如果对分区查询而where子句中没有加分区过滤,将会禁止提交这个任务!
查询子分区
SHOW PARTITIONS EMPLOYEES PARTITIONS (COUNTRY='CN');
载入数据创建分区
LOAD DATA LOCAL INPATH '${ENV:HOME}/CALIFORNIA-EMPLOYEES' INTO TABLE EMPLOYEES PARTITION(COUNTRY='CN', STATE='BK');
Hive不关心一个分区对应的分区目录是否存在或者分区目录下是否有文件。如果分区目录不存在或分区目录下没有文件,则对于这个过滤分区查询将没有返回结果。
表的存储格式可以通过STORED AS 显示指定,同时用户还可以在创建表时指定各种各样的分隔符。
TEXTFILE意味着所有字段都是用字母,数字, 字符编码,包括国际字符集。
使用TEXTFILE,每一行被认为是一个单独的记录。
SEQUENCEFILE 和 RCFILE使用二进制编码和压缩来优化磁盘空间使用以及IO带宽性能。
Hive使用一个inputformat对象将输入流分割成记录,然后使用一个outputformat对象将记录格式化为输出流,再使用一个SerDe在读数据时将记录解析成列,在写数据时将列编码成记录。
Hive提供WITH SERDEPROPERTIES 功能,允许用户传递配置信息给SerDe。
删除表
DROP TABLE IF EXISTS employees;
备注:
Hadoop回收站功能
用户如果开启该功能(默认为关闭),数据将会在删除后转移到用户在分布式文件系统中的用户根目录下的.Trash目录下,也就是HDFS中的user$USER.Trash目录。可以配置fs.trash.interval的值设置为一个合理的正整数,这个值是“回收站检查点”间的时间间隔,单位为分钟。(版本不一定支持)误删数据可以通过重建表与分区,将误删文件由.Trash文件夹移动到正确的文件目录下来重新存储数据。
修改表
ATLER TALBE --仅仅修改表元数据,
表重命名
ALTER TABLE xxx RENAME TO new_xxx
增删改分区
ALTER TABLE XXX ADD IF NOT EXISTS PARTITION(, ,) LOCATION '//'; ALTER TABLE XXX PARTITION(, ,) SET LOCATION '//'; --移动分区路径,不移走数据,也不删除旧数据 ALTER TABLE XXX DROP IF EXISTS PARTITION(, ,);
修改表属性
ALTER TABLE XXX SET TBLPROPERTIES( );
修改存储属性
ALTER TABLE PARTITION(, ,) SET FILEFORMAT SEQUENCEFILE;
备注:
SERDEPROPERTIES属性可以使得SerDe的各种实现都允许用户进行自定义
列操作
修改列信息
ALTER TABLE xxx CHANGE COLUMN xxx XXXX COMMENT '--------' AFTER XXXXX
增加列
ALTER TABLE xxx ADD COLUMNS (, ,);
替换/删除列
ALTER TABLE XXX REPLACE COLUMNS(, , ,);
ALTER TABLE ... TOUCH .... -- 钩子 ALTER TABLE ... ARCHIVE(/UNARCHIVE) PARTITION( , ,) -- 将分区内的文件打成一个Hadoop压缩包 ALTER TABLE ... ENABLE(/DISABLE) NO_DROP/OFF_LINE; --防止分区删除或被查询