前言
总结常用hive语句, 方便查阅
操作database
create 创建
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
- schema和database的用法相同,这里记录一下混个眼熟
- 数据库可以直接从hdfs上整体加载进来
drop 删除
DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];
- restrict是默认的删除方式,使用它等同于不加相应关键词
- restrict(或者不加)只能够删除空库,cascade可以删除非空库
alter 更改
功能 | 语句 |
更改属性 |
|
更改拥有者 |
|
更改数据源 |
|
- dbproperties就是database properties的简写
- 创建数据库时指定的属性大多都可以改变,但是库名不可以
其它
功能 | 语句 |
查看库信息 |
|
切换到指定数据库 |
|
查看当前数据库 |
|
设置显示当前库 |
|
设置显示表头 |
|
开启本地模式 |
|
log4j文件指定日志存放 |
|
操作table
创建: create
1. 使用已有表的表结构, 创建新表
-- 仅复制结构, 关键词like
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
-- 复制表结构和内容, as select语句
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[AS select_statement];
2. 完整的创建一张表
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]
-- 指定分桶依据,指定默认排序,指定分桶数
[
ROW FORMAT DELIMITED
-- 指定分隔符
[FIELDS TERMINATED BY char [ESCAPED BY char]]
-- 设置列分隔符(escaped by : 指定转义字符)
[COLLECTION ITEMS TERMINATED BY char]
-- 设置集合的分隔符
[MAP KEYS TERMINATED BY char]
-- 设置键值对的分隔符
[LINES TERMINATED BY char]
-- 设置行分隔符
[NULL DEFINED AS ``char``]
-- 设置将null值存储为什么字符,默认为/n.
-- 如果表中有大量null,使用默认字符可能会占据大量空间.可以自定义为''
]
[STORED AS file_format]
-- 指定存储类型
[LOCATION hdfs_path]
-- 指定从数据库(在hdfs上的)的位置
;
导入: load/insert
功能 | 语句 |
从本地追加导入 |
|
从hdfs覆盖导入 |
|
从其它表追加导入 |
|
查询数据(dql): select
select name
-- 聚合函数, 别名可以在hiving和order by中使用
, count(name) as con
-- 开窗函数, 结算顺序在group by之后, 所以可以使用聚合函数
, row_number() over(partition by count(name) order by name)
from mytable
where age>13
group by name
having con > 1
order by con
limit 3;
删除: drop
功能 | 语句 |
删除 |
|
仅清空数据 |
|
更改: alter
功能 | 语句 |
改名 |
|
增加列 |
|
修改列 |
|
重置列 |
|
更改表配置
功能 | 语句 |
设置跳过第一行 |
|
更改表说明 |
|
更改为内部表 |
|
更改为外部表 |
|
更改列分隔符 |
|
查看表配置 |
|
其它
功能 | 代码 |
查看表(简单) |
|
查看表(详细) |
|
查看建表语句 |
|
txt导出 |
|
分区
增加分区
ALTER TABLE table_name ADD [IF NOT EXISTS]
PARTITION partition_spec [LOCATION 'location']
[, PARTITION partition_spec [LOCATION 'location'], ...];
注1: 分区值必须是String类型
注2: add方法改变了表的元数据, 但是不会移动源数据
其它
功能 | 语句 |
删除分区 |
|
显示分区 |
|
加载内容 |
|
注1: 动态分区不能用load方式加载
这是因为动态分区需要使用列名,而load过程无法指定列名
注2: 纯动态分区需要调整设置, 如下
属性 | 键值对 |
是否允许纯动态分区 |
|
禁用严格模式 |
|
最大区块 |
|
每个区块的最大容量 |
|
分桶
增加分桶
ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name, ...)]
INTO num_buckets BUCKETS;
加载数据
insert into table table_name select_statement;
注: 分桶数据只能使用insert into
, 因为如果用load
直接加载,分桶就失去了效果
查询数据
select * from table_name tablesample (bucket x out of y on uid);
注1:其中x表示从第几桶开始查询,起始为1
注2.:y是查询总的桶数.y可以是总的桶数的倍数或者是因子;x不能大于y
分桶相关的set
功能 | 键值对 |
强制分桶 | set hive.enforce.bucketing=false/true |
设置reduce个数 | set mapreduce.job.reduces=4 |