HiveQL 数据定义
HiveQL 是Hive查询语言,不完成遵循任一种ANSI SQL标准的修订版。
Hive 不支持行级插入操作、更新操作和删除操作,也不支持事务
Hive中的数据库
Hive中数据库本质上是表的一个目录或者命名空间,这样可以避免表命名的冲突。
创建数据库
Hive 会为每个数据库创建一个目录,数据库里的表将会以这个数据库目录的子目录的形式存储。
hive> CREATE DATABASE financials;
hive> CREATE DATABASE IF NOT EXISTS financials;
显示数据库
如果数据库非常多的话,可以使用正则表达式匹配来筛选出需要的数据库名
hive> SHOW DATABASE LIKE 'h.*'
human_resources
hive>...
数据库所在目录位于属性hive.metastore.warehouse.dir
所指定的目录,其中default这个数据库比较特殊,没有相应的目录,所以default的表都是在hive.metastore.warehouse.dir
顶层目录,数据库的文件目录名是以.db结尾
用户可以通过如下命令来修改文件存储的这个默认位置
hive> CREATE DATABASE financials
> LOCATION '/my/preferred/directory'
hive> CREATE DATABASE financials
> COMMENT 'Holds all financials tables'
hive> DESCRIBE DATABASE financials;
financials Holds all financials tables
hdfs://master-server/user/hive/warehouse/financials.db
在这个例子中URL格式是hdfs
, 如果安装的是MapR,那么这里就是maprfs
,用户也可以使用亚马逊的S3特定的格式s3n
为了脚本的可移植性,通常会省略掉那个服务器和端口号信息,而只有在涉及到另一个分布式文件系统实例(包括S3存储)的时候才会指明该信息。
hive> CREATE DATABASE financials
> WITH DBPROPERTIES ('creater' = 'Mark Moneybags','date' = '2012-01-02')
hive> DESCRIBE DATABASE financials;
financials Holds all financials tables
hdfs://master-server/user/hive/warehouse/financials.db
hive> DESCRIBE DATABASE EXTENDED financials;
hdfs://master-server/user/hive/warehouse/financials.db
(creater=Mark Moneybags,date=2012-01-02)
USE 命令用于将某个数据库设置为用户当前的工作数据库,和在文件系统中切换工作目录是一个概念:
hive> USE financials;
...
可以通过设置一个属性值来在提示符里面显示当前所在的数据库
hive> set hive.cli.print.current.db=true
hive (financials) > USE default
hive (default) > set hive.cli.print.current.db=false
hive> ...
删除数据库,IF EXISTS
子句是可选的,如果加了这个子句,就可以避免因数据库financials不存在而抛出警告信息。默认情况下,Hive是不允许用户删除一个包含有表的数据库的,用户要么先删除数据库中的表,然后再删除数据库;要么在删除命令的最后面加在CASCADE
这样可以使Hive自行先删除数据库中的表:
hive> DROP DATABASE IF EXISTS financials;
hive> DROP DATABASE IF EXISTS financials CASCADE;
修改数据库
用户可以使用ALTER DATABASE
命令来为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个个数据库的属性信息。数据库的其他元数据信息是不可更改
的,包括数据库名
和数据存储的目录位置
创建表
Hive的CREATE TABLE语句是遵循SQL语法惯例的,同时Hive的这个语句中具有显著的功能扩展,使其可以具有广泛的灵活性。
用户可以在字段类型后为每个字段增加一个注释。和数据库一样,用户也可以为这个表本身添加一个注释,还可以自定义一个或多个表属性。TBLPROPERTIES
主要作用是按键-值对的格式为表增加额外的文档说明。
Hive 自动增加两个表属性: 一个是last_modified_by
一个是last_modified_time
分别保存着最后修改这个表的用户名,和最后一次修改的新纪元时间秒。
用户还可以拷贝一张已经存在的表的表模式(而无需拷贝数据,类似表结构)
hive> CREATE TABLE IF NOT EXISTS mydb.employees2
LIKE mydb.employees;
Hive 并非支持所有的正则表达式功能。如果用户了解正则表达式的话 ,最好事前先测试下备选的正则表达式是否生效。
我们也可以使用DESCRIBE EXTENDED mydb.employees
命令来查看这个表的详细表结构信息,
还有一种使用FORMATTED
关键字替代EXTENDED
关键字的话,可以提供更加可读的和冗长的输出信息。
如果用户只想查看某一列的信息,那么只要在表名后增加这个字段的名称即可,这种情况下, EXTENDED
关键字也不会增加更多输出信息。
hive> DESCRIBE mydb.employees.salary;
salary float Employee salary
管理表
我们目前所创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少)控制着数据的生命周期。
但是,管理表不方便和其他工作共享数据,例如: 假设我们有一份由Pig或者其他工具创建并且主要由这一工具使用的数据,同时我们还想Hive在这份数据上执行一些查询,可以并没有给予Hive对数据的所有权,我们可以创建一个外部表
指向这份数据,而并不需要对其具有所有权。
外部表
下面语句将创建一个外部表,其可以读取所有位于/data/stocks目录下的以逗号分隔的数据:
CREATE EXTERNAL TABLE IF NOT EXISTS stocks (
exchange STRING,
symbol STRING,
ymd STRING,
price_open FLOAT,
price_high FLOAT,
price_low FLOAT,
price_close FLOAT,
volume INT,
price_adj_close FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/stocks';
关键字EXTERNAL
告诉Hive这个表是外部表,而后面的LOCATION
…子句则用于告诉Hive数据位于哪个路径下。
因为表是外部表,所以Hive并非认为其完全拥有这份数据。因此,删除该表并不会删掉这份数据,不过描述表的元数据信息会被删掉。
用户可以在DESCRIBE EXTENDED tablename
语句的输出中查看到表是否是管理表或者是外部表。在末尾的详细表信息输出中,对于管理表,用户可以看到如下信息:
... tableType:MANAGED_TABLE)
对于外部表,用户可以看到如下信息:
... tableType: EXTERNAL_TABLE)