1.进入 hive 数据库:
hive
2.查看hive中的所有数据库:
show databases;
3.用 default 数据库
use default;
4.查看所有的表
show tables;
5.查询 book 表结构:
desc book ;
6.查询 book 表数据
select * from book;
7.创建 shop 数据库
create database shop;
create database if not exists shop;
创建 shop 数据库 并指定在hdfs的位置
create database shop localtion ‘/test/1’;
8.删除 shop 数据库
drop dtatbase if exists shop ;
dorp schema shop;
全部删除相应的表,在删除数据库之前:
drop database if exists shop cascade;
9.创建表tb_employee
create table if not exists tb_employee
( id int ,
name string,
dept string
) comment ‘员工信息表’
row format DELIMTED
fields terminated by ‘\t’
lines terminated by ‘\n’
stored as textfile;
如果要增加分区必须在创建表的时候就创建分区,不然就得删掉重新建表
create table if not exists tb_employee
( id int ,
name string,
dept string
) comment ‘员工信息表’
partitioned by (year int)
row format DELIMTED
fields terminated by ‘\t’
lines terminated by ‘\n’
stored as textfile;
stored as textfile 文件格式,文件格式在hive中有三种:textfile,RCfile,Sequencefile
10.添加数据到表中
load data local inpath ‘/usr/hadoop/hive/employee.txt’
overwrite into tb_employee;
如果table 是个分区表,则必须在添加时指定分区
load data local inpath ‘/usr/hadoop/hive/employee.txt’ overwrite
into tb_employee partition(year=2023);
load data : 加载数据
local: 本地数据
inpath: 文件地址
overwrite:覆盖表中的数据,不加overwrite是追加数据
插入表数据
insert into tb_employee(id,name) values(‘1’,‘wcz’);
11.重命名表格
alter table tb_temployee rename to emp;
12.修改emp 表中 name 字段 为 user_name
alter table emp change name user_name string;
13.修改 emp 表中 salary 的数据类型从 float 改为 double
alter table emp change salary salary double;
14.删除emp 表
drop talbe emp;
15.创建视图
create view emp_view as select * from emp where salary > 3000;
16.不同的连接
join
left outer join
right outer join
full outer join
left semi join on
只在on设置右表的查询条件且查询只包含左表的结果
17.创建外部表
create external table out_employee
( id int ,
name string,
dept string
) ;
18.查询外部表信息
desc formatted out_employee ;
19.获取字符串第一个字符
1.SUBSTRING(cloumn_name,1,1)
2.LEFT (cloumn_name,1,1)
3.REGEXP_EXTRACT(cloumn_name,‘^(.)’,1)
20.排序
1.order by : 全局排序,只会有一个reduce,不建议
默认升序: ASC 降序 : DESC
在hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。
2.sort by : 局部排序,保证每个reduce上是有序的,但全局不一定
3..distribute by 分区排序,可以将相同的key放到同一个reduce进行处理,但不保证有序
想要保证有序 distribute by 语句后面加上 sort by
4.cluster by score = distribute by score sort by score
但是默认升序,不支持指定
21.备份一个表
1.先备份表结构,再备份表数据
create table if not exists borrow_log_bak like borrow_log;
insert into borrow_log_bak select * from borrow_log;
以下摘抄 点击跳转到原文 https://zhuanlan.zhihu.com/p/662539681
22.分组 group by
使用 group by 分组后面只能跟 字段 或者聚合函数 后面也可以是使用 having 对数据进行进行筛选
23.聚合函数
count(*) 包含null值,统计所有行数
count(name) 不包含null值
min 求最小值,不包含null值,除非所有值都是null
avg 求平均值,不包括null值var_pop(col) 统计结果集中col非空集合的总体变量(忽略NULL),返回值 double var_samp(col)
统计结果集中col费空集合的样本变量(忽略NULL)返回值 double stddev_pop
该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与var_pop函数的平方根相同 percentile(BIGINT col,p)
求准确的第pth个百分数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点类型
24.关系运算符
等于 =
不等于 != 或者 <>
小于 <
小于等于 <=
大于 >
大于等于 >=
判断为空 is null
判断非空 is not null
25.数值运算
取整: round(double a) 遵循四舍五入原则
指定精度取整:round(double a,int b)
向下取整:floor(double a)
向上取整:ceil(double a)
取随机数:rand() 或者 rand(int seed) 返回0-1内的随机数,如果指定了seed,那每次返回的结果都是一样的
自然指数: exp(double a) 返回自然对数e的a次方
以10为底的对数函数:log10(double a) 返回以10为底a的对数
幂运算:pow(double a,double b) 返回 a 的 b 次幂
开平方:sqrt(double a) 返回 a 的平方根
二进制数:bin(BIGINT a) 返回 a 的二进制表示
。。。。
十六进制函数: hex()、将十六进制转化为字符串函数: unhex()
进制转换函数: conv(bigint num, int from_base, int to_base) 说明: 将数值num从from_base进制转化到to_base进制
此外还有很多数学函数:绝对值函数: abs()、正取余函数:
pmod()、正弦函数: sin()、反正弦函数: asin()、余弦函数: cos()、反余弦函数: acos()、positive函数:
positive()、negative函数: negative()
26.条件函数
If函数: if
语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
返回值: T
说明: 当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull
hive> select if(1=2,100,200) ;
200
hive> select if(1=1,100,200) ;
100
非空查找函数: coalesce
语法: coalesce(T v1, T v2, …)
返回值: T
说明: 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL
hive> select coalesce(null,‘100’,‘50’) ;
100
条件判断函数:case when (两种写法,其一)
语法: case when a then b [when c then d]* [else e] end
返回值: T
说明:如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e
hive> select case when 1=2 then ‘tom’ when 2=2 then ‘mary’ else ‘tim’ end from tableName;
mary
条件判断函数:case when (两种写法,其二)
语法: case a when b then c [when d then e]* [else f] end
返回值: T
说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f
hive> Select case 100 when 50 then ‘tom’ when 100 then ‘mary’ else ‘tim’ end from tableName;
mary
27.日期函数
注:以下SQL语句中的 from tableName 可去掉,不影响查询结果
获取当前UNIX时间戳函数: unix_timestamp
语法: unix_timestamp()
返回值: bigint
说明: 获得当前时区的UNIX时间戳
hive> select unix_timestamp() from tableName;
1616906976
UNIX时间戳转日期函数: from_unixtime
语法: from_unixtime(bigint unixtime[, string format])
返回值: string
说明: 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式
hive> select from_unixtime(1616906976,‘yyyyMMdd’) from tableName;
20210328
日期转UNIX时间戳函数: unix_timestamp
语法: unix_timestamp(string date)
返回值: bigint
说明: 转换格式为"yyyy-MM-dd HH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0。
hive> select unix_timestamp(‘2021-03-08 14:21:15’) from tableName;
1615184475
指定格式日期转UNIX时间戳函数: unix_timestamp
语法: unix_timestamp(string date, string pattern)
返回值: bigint
说明: 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0。
hive> select unix_timestamp(‘2021-03-08 14:21:15’,‘yyyyMMdd HH:mm:ss’) from tableName;
1615184475
日期时间转日期函数: to_date
语法: to_date(string timestamp)
返回值: string
说明: 返回日期时间字段中的日期部分。
hive> select to_date(‘2021-03-28 14:03:01’) from tableName;
2021-03-28
日期转年函数: year
语法: year(string date)
返回值: int
说明: 返回日期中的年。
hive> select year(‘2021-03-28 10:03:01’) from tableName;
2021
hive> select year(‘2021-03-28’) from tableName;
2021
日期转月函数: month
语法: month (string date)
返回值: int
说明: 返回日期中的月份。
hive> select month(‘2020-12-28 12:03:01’) from tableName;
12
hive> select month(‘2021-03-08’) from tableName;
8
日期转天函数: day
语法: day (string date)
返回值: int
说明: 返回日期中的天。
hive> select day(‘2020-12-08 10:03:01’) from tableName;
8
hive> select day(‘2020-12-24’) from tableName;
24
日期转小时函数: hour
语法: hour (string date)
返回值: int
说明: 返回日期中的小时。
hive> select hour(‘2020-12-08 10:03:01’) from tableName;
10
日期转分钟函数: minute
语法: minute (string date)
返回值: int
说明: 返回日期中的分钟。
hive> select minute(‘2020-12-08 10:03:01’) from tableName;
3
日期转秒函数: second
语法: second (string date)
返回值: int
说明: 返回日期中的秒。
hive> select second(‘2020-12-08 10:03:01’) from tableName;
1
日期转周函数: weekofyear
语法: weekofyear (string date)
返回值: int
说明: 返回日期在当前的周数。
hive> select weekofyear(‘2020-12-08 10:03:01’) from tableName;
49
日期比较函数: datediff
语法: datediff(string enddate, string startdate)
返回值: int
说明: 返回结束日期减去开始日期的天数。
hive> select datediff(‘2020-12-08’,‘2012-05-09’) from tableName;
213
日期增加函数: date_add
语法: date_add(string startdate, int days)
返回值: string
说明: 返回开始日期startdate增加days天后的日期。
hive> select date_add(‘2020-12-08’,10) from tableName;
2020-12-18
日期减少函数: date_sub
语法: date_sub (string startdate, int days)
返回值: string
说明: 返回开始日期startdate减少days天后的日期。
hive> select date_sub(‘2020-12-08’,10) from tableName;
2020-11-28
28.字符串函数
字符串长度函数:length
语法: length(string A)
返回值: int
说明:返回字符串A的长度
hive> select length(‘abcedfg’) from tableName;
7
字符串反转函数:reverse
语法: reverse(string A)
返回值: string
说明:返回字符串A的反转结果
hive> select reverse(‘abcedfg’) from tableName;
gfdecba
字符串连接函数:concat
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
hive> select concat(‘abc’,'def’,‘gh’)from tableName;
abcdefgh
带分隔符字符串连接函数:concat_ws
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
hive> select concat_ws(‘,’,‘abc’,‘def’,‘gh’)from tableName;
abc,def,gh
字符串截取函数:substr,substring
语法: substr(string A, int start),substring(string A, int start)
返回值: string
说明:返回字符串A从start位置到结尾的字符串
hive> select substr(‘abcde’,3) from tableName;
cde
hive> select substring(‘abcde’,3) from tableName;
cde
hive> select substr(‘abcde’,-1) from tableName; (和ORACLE相同)
e
字符串截取函数:substr,substring
语法: substr(string A, int start, int len),substring(string A, int start, int len)
返回值: string
说明:返回字符串A从start位置开始,长度为len的字符串
hive> select substr(‘abcde’,3,2) from tableName;
cd
hive> select substring(‘abcde’,3,2) from tableName;
cd
hive>select substring(‘abcde’,-2,2) from tableName;
de
字符串转大写函数:upper,ucase
语法: upper(string A) ucase(string A)
返回值: string
说明:返回字符串A的大写格式
hive> select upper(‘abSEd’) from tableName;
ABSED
hive> select ucase(‘abSEd’) from tableName;
ABSED
字符串转小写函数:lower,lcase
语法: lower(string A) lcase(string A)
返回值: string
说明:返回字符串A的小写格式
hive> select lower(‘abSEd’) from tableName;
absed
hive> select lcase(‘abSEd’) from tableName;
absed
去空格函数:trim
语法: trim(string A)
返回值: string
说明:去除字符串两边的空格
hive> select trim(’ abc ') from tableName;
abc
左边去空格函数:ltrim
语法: ltrim(string A)
返回值: string
说明:去除字符串左边的空格
hive> select ltrim(’ abc ') from tableName;
abc
右边去空格函数:rtrim
语法: rtrim(string A)
返回值: string
说明:去除字符串右边的空格
hive> select rtrim(’ abc ') from tableName;
abc
正则表达式替换函数:regexp_replace
语法: regexp_replace(string A, string B, string C)
返回值: string
说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
hive> select regexp_replace(‘foobar’, ‘oo|ar’, ‘’) from tableName;
fb
正则表达式解析函数:regexp_extract
语法: regexp_extract(string subject, string pattern, int index)
返回值: string
说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。
hive> select regexp_extract(‘foothebar’, ‘foo(.?)(bar)', 1) from tableName;
the
hive> select regexp_extract(‘foothebar’, 'foo(.?)(bar)’, 2) from tableName;
bar
hive> select regexp_extract(‘foothebar’, ‘foo(.?)(bar)‘, 0) from tableName;
foothebar
strong>注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。
select data_field,
regexp_extract(data_field,’.?bgStart\=([^&]+)’,1) as aaa,
regexp_extract(data_field,‘.?contentLoaded_headStart\=([^&]+)‘,1) as bbb,
regexp_extract(data_field,’.?AppLoad2Req\=([^&]+)’,1) as ccc
from pt_nginx_loginlog_st
where pt = ‘2021-03-28’ limit 2;
URL解析函数:parse_url
语法: parse_url(string urlString, string partToExtract [, string keyToExtract])
返回值: string
说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.
hive> select parse_url
(‘https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1’, ‘HOST’)
from tableName;
www.tableName.com
hive> select parse_url
(‘https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1’, ‘QUERY’, ‘k1’)
from tableName;
v1
json解析函数:get_json_object
语法: get_json_object(string json_string, string path)
返回值: string
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
hive> select get_json_object(‘{“store”:{“fruit”:[{“weight”:8,“type”:“apple”},{“weight”:9,“type”:“pear”}], “bicycle”:{“price”:19.95,“color”:“red”} },“email”:“amy@only_for_json_udf_test.net”,“owner”:“amy”}’,‘$.owner’) from tableName;
空格字符串函数:space
语法: space(int n)
返回值: string
说明:返回长度为n的字符串
hive> select space(10) from tableName;
hive> select length(space(10)) from tableName;
10
重复字符串函数:repeat
语法: repeat(string str, int n)
返回值: string
说明:返回重复n次后的str字符串
hive> select repeat(‘abc’,5) from tableName;
abcabcabcabcabc
首字符ascii函数:ascii
语法: ascii(string str)
返回值: int
说明:返回字符串str第一个字符的ascii码
hive> select ascii(‘abcde’) from tableName;
97
左补足函数:lpad
语法: lpad(string str, int len, string pad)
返回值: string
说明:将str进行用pad进行左补足到len位
hive> select lpad(‘abc’,10,‘td’) from tableName;
tdtdtdtabc
注意:与GP,ORACLE不同,pad 不能默认
右补足函数:rpad
语法: rpad(string str, int len, string pad)
返回值: string
说明:将str进行用pad进行右补足到len位
hive> select rpad(‘abc’,10,‘td’) from tableName;
abctdtdtdt
分割字符串函数: split
语法: split(string str, string pat)
返回值: array
说明: 按照pat字符串分割str,会返回分割后的字符串数组
hive> select split(‘abtcdtef’,‘t’) from tableName;
[“ab”,“cd”,“ef”]
集合查找函数: find_in_set
语法: find_in_set(string str, string strList)
返回值: int
说明: 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0
hive> select find_in_set(‘ab’,‘ef,ab,de’) from tableName;
2
hive> select find_in_set(‘at’,‘ef,ab,de’) from tableName;
0
29.内置函数
NVL
给值为NULL的数据赋值,它的格式是NVL( value,default_value)。它的功能是如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个参数都为NULL ,则返回NULL
select nvl(column, 0) from xxx;
行转列
函数 描述
CONCAT(string A/col, string B/col…) 返回输入字符串连接后的结果,支持任意个输入字符串
CONCAT_WS(separator, str1, str2,…) 第一个参数参数间的分隔符,如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间。
COLLECT_SET(col) 将某字段的值进行去重汇总,产生array类型字段
COLLECT_LIST(col) 函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。
列转行(一列转多行)
Split(str, separator): 将字符串按照后面的分隔符切割,转换成字符array。
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:
LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
准备数据源测试
movie | category |
---|---|
《功勋》 | 记录,剧情 |
《战狼2》 | 战争,动作,灾难 |
SQL:
SELECT movie,category_name
FROM movie_info
lateral VIEW
explode(split(category,“,”)) movie_info_tmp AS category_name ;
测试结果
《功勋》 记录
《功勋》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难