【Hive笔记】 三、Hive的DDL和DML操作

首先明确定义什么是 DDL 和 DML:

  • DDL(Data Definition Language) 数据定义语言: 对数据库中的对象进行操作
  • DML(Data Manipulation Language) 数据操纵语言: 对数据库中的数据进行操作

DDL操作

新建数据库

-- 新建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name   --DATABASE|SCHEMA 是等价的
[COMMENT database_comment] --数据库注释
[LOCATION hdfs_path] --存储在 HDFS 上的位置
[WITH DBPROPERTIES (property_name=property_value, ...)]; --指定额外属性

操作数据库

-- 查看数据库
SHOW DATABASES;
-- 使用数据库
USE database_name;
-- 查看数据库信息
DESC DATABASE [EXTENDED] db_name; --EXTENDED 表示是否显示额外属性
-- 删除数据库: 默认RESTRICT若数据库中存在表则报错
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

新建数据表

-- 新建数据表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name     --表名
    [
        (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, ...) ON ((col_value, col_value, ...)...)
    [STORED AS DIRECTORIES]
]  --指定倾斜列和值
[
    [ROW FORMAT row_format]
    [STORED AS file_format]
    | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]  -- 指定行分隔符、存储文件格式或采用自定义存储格式
[LOCATION hdfs_path]  -- 指定表的存储位置
[TBLPROPERTIES (property_name=property_value, ...)]  --指定表的属性
[AS select_statement];   --从查询结果创建表

操作数据表

-- 加载数据
load data local inpath "data.txt" into table table_name;
-- 重命名表
ALTER TABLE table_name RENAME TO new_table_name;
-- 修改列
ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
[COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
-- 新增列
ALTER TABLE table_name ADD COLUMNS (col_name column_type COMMENT col_comment);
-- 清空整个表或表指定分区中的数据
TRUNCATE TABLE table_name [PARTITION (partition_column = partition_col_value, ...)];
-- 删除表
DROP TABLE [IF EXISTS] table_name [PURGE];

DML操作

整体更新数据

-- 通过加载文件覆盖数据表分区
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]
INTO TABLE table_name [PARTITION (partcol1=val1, partcol2=val2 ...)]
-- 通过查询结果覆盖数据表分区
INSERT OVERWRITE TABLE table_name [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]]
SELECT * FROM (select_statement);

更新删除数据

-- 更新
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
--删除
DELETE FROM tablename [WHERE expression]

该部分语法需要 HIVE 支持事务处理, 即在 hive-set.xml 中开启如下配置

<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
</property>
<property>
    <name>hive.enforce.bucketing</name>
    <value>true</value>
</property>
<property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</value>
</property>
<property>
    <name>hive.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
</property>
<property>
    <name>hive.in.test</name>
    <value>true</value>
</property>

注意: 事务表存在必须为分桶表+ORC的限制, 并且不支持 LOAD DATA 加载操作.

查询结果写入文件系统

INSERT OVERWRITE [LOCAL] DIRECTORY file_path
  [ROW FORMAT row_format] [STORED AS file_format]
  SELECT ... FROM ...

参考资料


【Hive笔记】 三、Hive的DDL和DML操作
https://www.windism.cn/1071711833.html
作者
windism
发布于
2022年2月18日
许可协议