Hive学习—HiveQL:数据定义

第4章 HiveQL:数据定义

HiveQL可能和MySQL语句接近,但是两者还是存在显著差异。Hive不支持行级插入操作、更新操作和删除操作。Hive也不支持事务。

4.1 Hive 中的数据库

--创建数据库
CREATE DATABASE financials
--查看Hive中包含的数据库
SHOW DATABASES
--使用正则匹配筛选出需要的数据库
SHOW DATABASES LIKE 'h.*'
-- 数据库所在位置
DESCRIBE DATABASES financials
-- 删除数据库
DROP DATABASE IF EXISTS financials
-- 修改数据库
ALTER DATABASE financials SET DBPROPERTIES('edited-by'='Joe Dba')

4.3 创建表

CREATE TABLE IF NOT EXISTS mydb.employees (
name STRING COMMENT 'Employee name',
salary FLOAT COMMENT 'Employee salary',
subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
deductions MAP<STRING,FLOAT> COMMENT 'Keys are deductions names,values are percentages',
address STRUCT<street:STRING,city:STRING,state:STRING>
COMMENT 'Home address')
--拷贝一张已经存在的表的表模式(而无需拷贝数据)
CREATE TABLE IF NOT EXISTS mydb.employees2 LIKE mydb.employees;
--查看所有的表
SHOW TABLES
--列举指定数据库下的表
SHOW TABLES IN mydb
--使用正则过滤表名
SHOW TABLE ‘empl.*’

4.3.1 管理表

4.3.2 外部表

关键字 EXTENAL 告诉 Hive 这个表是外部的,而后面的 LOCATION …子句则用于告诉Hive数据位于哪个路径下。
因为表是外部的,所以Hive并非认为其完全拥有这份数据。因此,删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

4.4 分区表、管理表

Hive 中有分区表的概念。我们可以看到分区表具有重要的性能优势,而且分区表还可以将数据以一种符合逻辑的方式进行组织,比如分层存储。

CREATE TABLE employee (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING>)
PARTITIONED BY (country STRING, state STRING)
--查看表中所有分区
SHOW PARTITIONS employees;
--查看是否存储某个特定分区键的分区
SHOW PARTITIONS employees PARTITION(country = 'US');
SHOW PARTITIONS employees PARTITION(country = 'US',state = 'AK');

4.4.1 外部分区表

4.4.2 自定义表的存储格式

CLUSTERED BY … INTO …BUCKETS子句还可以接一个可选的 SORTED BY…子句,“分桶表数据存储”

4.5 删除表

DROP TABLE IF EXISTS employees;

4.6 修改表

--表重命名
ALTER TABLE log_messages RENAME TO logmsgs;
--增加、修改和删除表分区
ALTER TABLE log_messages ADD IF NOT EXISTS 
PARTITION(year = 2011,month = 1,day = 1) LOCATION '/logs/2011/01/01'
PARTITION(year = 2011,month = 1,day = 2) LOCATION '/logs/2011/01/02'
...
--删除某个分区
ALTER TABLE log_messages DROP IF EXISTS 
PARTITION(year = 2011,month = 12,day = 2)

修改列信息
用户可以对某个字段进行重命名,并修改其位置、类型或者注释:

ALTER TABLE log_messages
CHANGE COLUMN hms hour_minutes_seconds INT
COMMENT 'The hours,minutes,and seconds part of the timestamp'
AFTER severity

增加列

ALTER TABLE log_messages ADD COLUMN(
app_name STRING COMMENT 'Application name' 

删除或者替换列

ALTER TABLE log_messages REPLACE COLUMNS (
hours_mins_secs INT COMMENT 'hour.minute,seconds from timestamp'
severity STRING COMMENT 'The message severity'

修改表属性

用户可以增加附加的表属性或者修改已经存在的属性,但是无法删除属性

ALTER TABLE log_messages SET TBLPROPERTIES ( 
'notes'='The process id is no longer captured; this column is always NULL');

修改存储属性

--修改存储属性
ALTER TABLE log_messages
PARTITION(year = 2012 , month = 1 , day = 1 )
SET FILEFORMAT SEQUENCEFILE;
--增加存储属性(如增加SERDEPROPERTIES属性)
ALTER TABLE log_messages
SET SERDEPROPERTIES (
'prop3'='values3'
'prop4'='values4')
ALTER TABLE stocks
CLUSTERED BY ( exchange,symbol)
SORTED BY (symbol)
INTO 48 BUCKETS;

SORTED BY 子句可选
CLUSTERED BY 和 INTO… BUCKETS子句必选(数据分桶)
众多的修改表语句
“钩子”
应用场景:某个脚本往分区2012/01/01中写入新的日志信息文件
ALTER TABLE…TOUCH

ALTER TABLE log_messages TOUCH PARTITION(year=2012,month=1,day=1)

如果表或者分区不存在,那么这个语句不会创建表或者分区。这种情况下要使用合适的创建策略。
ALTER TABLE…ARCHIVE PARTITION语句将这个分区内的文件打成一个Hadoop压缩包(HAR)文件。但是这样仅仅可以降低文件系统中文件数以及减轻NameNode压力,而不会减少任何存储空间。

ALTER TABLE log_messages ARCHIVE
PARTITION(year=2012,month=1,day=1)

Hive中防止分区被删除和被查询:

ALTER TABLE log_messages
PARTITION(year=2012,month=1,day=1) ENABLE NO_DROP;
ALTER TABLE log_messages
PARTITION(year=2012,month=1,day=1) ENABLE OFFLINE;

猜你喜欢

转载自blog.csdn.net/weixin_43387060/article/details/86663029