hive 中的数据定义

  1. 数据库
    创建一个数据库(IF NOT EXISTS)

    CREATE DATABASE test;
    CREATE DATABASE IF NOT EXISTS test;

    查看数据库(可使用正则查看)

    SHOW DATABASES;
    SHOW DATABASES LIKE 'h.*';

    创建数据库时,hive会为每个数据库创建一个目录,数据库中的表会以这个数据库的子目录形式存储。
    数据库所在的目录位于属性hive.metastore.warehouse.dir所指定的目录。默认为/user/hive/warehouse.
    当创建test数据库时,hive会创建/user/hive/warehouse/test.db的目录。

    CREATE TABLE test 
    LOCATION '/user/hive/mydatabase';

    查看数据库信息

    DESCRIBE DATABASE test;

    删除数据库

    DROP DATABASE IF EXISTS test;

    删除数据库时,hive是不允许删除一个包含有表的数据库,要么先删表,再删库,要么加上关键字CASCADE

    DROP DATABASE IF EXISTS test CASCADE;

    数据库是只可以增加属性,不可修改名字,目录位置等。

    ALTER DATABASE test SET DEPROPERTIES(‘edit-by’ = 'me');

  2. 创建表

    CREATE TABLE IF NOT EXISTS test.employees (
    name  STRING COMMENT 'employees name',
    salary FLOAT COMMENT 'employees salary',
    subordinateds ARRAY<STRING> COMMENT 'name of subordinateds',
    deductions MAP<STRING, FLOAT> COMMENT 'keys are deductions names, name of percentages',
    address STRUCT<street:STRING, city:STRING, state:STRING, zip: INT> COMMENT 'home address',)
    COMMENT 'description of the table'
    LOCATION '/user/hive/warehouse/test.db/employees';

    若表已存在,有IF NOT EXISTS时hive会忽略掉后面的语句,不会有任何提示。
    可使用SHOW CREATE TABLE 来查看创建表结构。
    复制一个已存在的表的表结构创建表:

    CREATE TABLE IF NOT EXISTS test.employees2 like test.employees;

    列出当前数据库的表。

    USE test;
    SHOW TABLES;
    SHOW TABLES IN test;

    外部表

    CREATE EXTERNAL TABLE IF NOT EXISTS stocks (
    exchange STRING,
    symbol STRING,
    ymd STRING )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    LOCATION '/data/stocks';

    EXTERNAL关键字表示表示外部表,删除外部表时数据不会被删除。

分区表

CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinateds ARRAY<STRING> COMMENT 'name of subordinateds',
deductions MAP<STRING, FLOAT> COMMENT 'keys are deductions names, name of percentages',
address STRUCT<street:STRING, city:STRING, state:STRING, zip: INT> COMMENT 'home address',)
PARTITIONED BY (country STRING, state STRING );

按照country(国家)再按照state(州)对数据进行分区。
分区表 hive会创建好反映分区结构的子目录,如

.../employees/country=CA/state=AB
.../employees/country=CA/state=BC
.../employees/country=US/state=AL

对于分区表,如果将hive设置为"strict(严格)"模式,WHERE语句没有分区过滤,将禁止提交任务。

外部分区表

    CREATE EXTERNAL TABLE IF NOT EXISTS log_messages (
    hms INT,
    severity STRING,
    server STRING,
    process_id INT,
    message STRING)
    PARTITIONED BY (year INT, month INT, day INT)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

把日志表按照天划分.
增加一个2019年2月3日的分区:

ALTER TABLE log_messages ADD PARTITION(year = 2019, month = 2, day = 3)
LOCATION 'hdfs:///data/log_messages/2019/02/03';

表的存储格式
TEXTFILE(文本文件),SEQUENCEFILE和RCFILE (都是二进制编码和压缩)

删除表

DROP TABLE IF EXISTS employees;

修改表(ALTER)
重命名

ALTER TABLE log_messages RENAME TO logmsgs;

增加修改和删除分区

ALTER TABLE log_messages ADD IF NOT EXISTS
PARTITION (year = 2019, month = 1, day = 1)  LOCATION '/logs/2019/01/01';
ALTER TABLE log_messages DROP IF EXISTS PARTITION(year = 2019, month = 1 ,day = 1);

增加列

ALTER TABLE log_messages ADD COLUMNS (
app_name STRING COMMENT 'Application name',
session_id LONG COMMENT 'the current session id');

修改列(把hms修改为hours_minutes_seconds并放置在severity后面)

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

删除列或替换列

ALTER TABLE log_messages REPLACE COLUMNS (
hour_mins_secs INT COMMENT '',
severity STRING COMMENT '',
message STRING COMMENT '');

以上例子移除所有字段后重新定义。

修改表属性

ALTER TABLE log_messages SET TBLPROPERTIES (
'notes' = '...');

修改存储属性
将2019年1月1日这个分区的存储格式改为SEQUENCEFILE:

ALTER TABLE log_messages 
PARTITION(year = 2019, month = 1, day = 1)
SET FILEFORMAT SEQUENCEFILE;

将分区内的文件打包压缩为HAR文件(仅仅可以降低文件个数减轻NameNode压力,不会减少任何的存储空间)

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

Hive提供了保护,防止分区被删除和被查询。

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

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

使用DISABLE替换ENABLE可以达到反向操作。这些操作不可用于分区表。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!