环境:CentOS7
hive-1.1.0-cdh5.14.0
hadoop-2.6.0-cdh5.14.0
数据库 Database
Hive中数据库的概念类似于表的所在目录或者命名空间,在这一点上跟mysql有点像,database即schema,而不像Oracle,database跟schema是两个不同的粒度。因此,在hive中,schemas/schema关键字一般都可以代替databases/database。
在hive中使用use dbname显式指定数据库,如果没有显式指定,则会使用默认的数据库default,存储在default库中的表目录会直接在HDFS的根目录中生成。
创建数据库:CREATE DATABASE [IF NOT EXISTS] dbname [comment xxx] ; 如果不使用IF NOT EXISTS子句,则在创建的数据库与已有的库同名的情况下,会抛出错误,comment子句为数据库增加描述信息
查看所有数据库:SHOW DATABASES; 这里可以使用LIKE子句来进行模糊查询。
删除数据库:DROP DATABASE dbname [cascade]; 使用cascade会删除带表的数据库,否则当数据库含表时使用drop的时候会抛出错误
查看指定数据库信息:DESC DATABASES dbname;查看数据库的描述信息和所在的文件目录位置路径
另外,可以在hive-site.xml中添加hive.cli.print.current.db=true,来在提示符里显示当前所在的数据库,但是beeline的话,官方文档指出的是使用--showDbInPrompt=true参数启动也可以有这个功能,但是实际测试并没有生效,有知道的可以留言一下>,<
表 Table
Hive中的表有几种,临时表,内部表,外部表,再细分有分区表,桶表。
注意:临时表只存在于当前session,且不支持索引和分区。
创建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name --(不加TEMPORARY/EXTERNAL的就是内部表)
[(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, ...) --(倾斜表,指定经常出现的值,以便应对数据倾斜时候的JOIN)
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)