hive是hdfs上的数据仓库,能够将一个个大文件有效地管理起来,并对其进行统计分析。数据仓库看待数据的方式与常见的数据库是完全不同的,它的最小粒度是文件而不是单条数据。hive一般在hdfs上的路径为/user/hive/warehouse,而hive中的数据库(如demo)的路径就是/user/hive/warehouse/demo.db,在往下就是表的路径如:/user/hive/warehouse/demo.db/test。管理hive上的数据分为两部分:定义数据以及操纵数据。
基本命令
切换数据库:use 数据库名;
显示当前数据库中的所有变:show tables;
查看表结构:desc 表名;
查看建表语句:show create table 表名;
数据定义语句(DDL)
创建表
完整语句
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)
- hive可以创建临时表[temporary],临时表在当前会话结束时(如关闭hive客户端)会被自动删除。
- hive可以外部的映射表[external],即hive并不将这些数据存储在自己的hdfs路径中,而只保存表的元数据。这样hive便可访问更多的数据源,如hbase。
- hive可以直接将select语句的结果保存为一个表:create table t2 as select * from t1;
- hive的基本单元是文件,那么在创建表的时候可以指定文件中每行数据的分隔符,即按该分割符分割后即为表的各列:create table t(c1 string, c2 string) row format delimited fields terminated by '\t'。
- hive中的表就是hdfs上的一个路径,在创建表时可以在其下继续创建文件目录,这样的好处就是在查询时可以只访问一些指定的目录来提高性能。create table t1(id string) partitioned by (year string, month string),这样t1路径下就是year的文件夹,而year的每个值路径下还有month文件夹,如图所示:
修改表
表重命名:alter table 原表名 rename to 新表名
删除分区:alter table xx drop partition (xx='')
数据操纵语言(DML)
加载数据
1)从本地加载: load data local inpath 'data/t1' into table t1;
2)从HDFS转移:load data inpath '/user/hive/project/data1' into table xxx;