Hive 语法指南

一、一些常用命令

创建数据库

create database if not exists my_base;

数据库里有表格 my_table

show databases; //列出数据库

describe databases my_base; //展示数据库 my_base的信息

use my_base; //使用某个数据库 my_base

set hive.cli.print.current.db=true; //显示列头
set hive.cli.print.current.db=false; //关闭列头

show tables; //展示这个数据库里面的所有表格

show tables in my_base; //展示数据库 my_base 里面的所有表格

show tables like 'm.*'; //通配符 模糊查找,以 m 开头

show create table my_table; //获得表格 my_table 的建表语句,其中包括表格的字段,HDFS location 等信息

describe my_table; //展示表格 my_table 的字段以及字段类型

describe formatted my_table; //详细描述表格 my_table,包括表格的结构,所在的 databaseownerlocation
                             //表格的类型(managed table or external table),存储信息等

二、创建表

三种创建 table 的方法

create table test_table (
  a INT COMMENT 'comment1', 
  b STRING COMMENT 'comment2'
); //创建 test_table 并指定字段类型【、添加字段注释】

create table test1 
like 
test_table; //只是复制了表的结构,并没有复制内容;

create table test2 
as 
select * from test_table; //从其他表格查询,再创建表格;

示例(完整建表语句及关键词解释)

CREATE EXTERNAL TABLE my_table(               //关键词 EXTERNAL:表示该表为外部表;如果没有 EXTERNAL 关键词,则表示内部表
  id INT,                     
  ip STRING COMMENT 'Visitor ip',             //关键词 COMMENT:为表和列添加注释
  avg_view_depth DECIMAL(5,1), 
  bounce_rate DECIMAL(6,5) 
) 
COMMENT 'my table' 
PARTITIONED BY (day STRING)                   //关键词 PARTITIONED BY:表示该表为分区表;这里分区字段为 day,类型为 string
ROW FORMAT DELIMITED                          //关键词 ROW FORMAT DELIMITED:指定表的分隔符,通常后面要与以下关键字连用:(1)FIELDS TERMINATED BY ,: 指定每行中字段分隔符为逗号;
FIELDS TERMINATED BY ','                      //(2)LINES TERMINATED BY ‘\n:指定行分隔符 COLLECTION;(3)ITEMS TERMINATED BY ,:指定集合中元素之间的分隔符;
                                              //(4)MAP KEYS TERMINATED BY : //指定数据中 Map 类型的 Key  Value 之间的分隔符
STORED AS textfile                            //关键词 STORED AS:指定表在 HDFS 上的文件存储格式,可选的文件存储格式有:TEXTFILE:文本,默认值;SEQUENCEFILE:二进制序列文件;
                                              //ORC:列式存储格式文件,比 RCFILE 有更高的压缩比和读写效率;PARQUET:列出存储格式文件
LOCATION '/usr/local/hadoop/examples/input';  //关键词 LOCATION:指定表在HDFS上的存储位置

三、修改表格

alter table my_table add columns (reporttime STRING COMMENT '上报时间'); //为表格增加列

alter table test_table rename to my_table; //修改表名

alter table my_table add partition (day=20200416); //增加分区

alter table my_table drop partition (day=20200416); //删除分区

alter table my_table partiton (day=20200416) rename to partition (day=20200415); //修改分区

load data local inpath '/liming/hivedata/datatest' overwrite into table my_table; //从文件加载数据(覆盖原来数据)

load data local inpath '/liming/hivedata/datatest' into table my_table; //从文件加载数据(添加数据)

insert overwrite directory 'tmp/tmpdata' select a.* from my_table a; //导出数据到文件

四、查询和分析数据

1、基本操作

表格 my_table 的格式:owner(string),key(string),value(int), day(bigint)

select * from my_table; //查找数据

select * from my_table limit 10; //查找前10行数据

select * from my_table where day=20200416; //查找day=20200416的数据

select * from my_table where day>=20200415 and day<=20200416; 

select * from my_table where day=20200416 order by value; //查出来之后按照value的值升序排序

select * from my_table where day=20200416 order by value desc; //降序

insert [overwrite] into table my_table partition (day=20200416) values('20031','key_20032',1); //不使用overwrite是往表格里追加一条数据,使用overwrite就是覆盖整个表格

2、高级操作

  • (inner) join: 在表格中至少存在一个匹配时,inner join 的关键字返回行;
  • left join: 会从左边的表格返回所有的行,即使在右边的表格中没有匹配的行。
  • right join:会从右边的表格返回所有的行,即使在左边的表格中没有匹配的行。
  • full join:只要其中的一张表存在匹配,full join 就会返回行。在某些数据库中,full join 也称作 full outer join。
  • union:用于合并两个或者多个 select 语句的结果集。
  • is NULL & is not NULL:来判断某个字段是否是空集。

一个简单示例:

select * from my_test1 t1
inner join my_teat2 t2
on t1.id=t2.id;

3、group by 与常见聚合函数

  • group by:通常和聚合函数一起使用,根据一个或者多个列对结果进行分组

  • 常见的聚合函数有:

    函数名 功能
    AVG 返回列值的平均值
    COUNT 返回列值的数目
    MAX/MIN 返回一列值的最大值/最小值
    SUM 返回数列值的总和

4、一些数值函数

函数 功能
MOD(x, y) 取模:x%y
LN(DOUBLE a) 返回给定数值的自然对数
POWER(DOUBLE a, DOUBLE b) 返回某数的乘幂
SQRT(DOUBLE a) 开平方
SIN/COS/ASIN/ACOS 三角函数