hql语言学习

Show

-- 显示show
show databases;
show tables in database;
-- 显示表的一些属性
desc extended t;
-- 全部信息
desc formatted t;
-- 显示分区信息
show partitions t;

show partitions t partition(dt=20200811);

Create/Drop/Truncate/Alter

create (external) table if not exists t(
id int comment "id",
name string comment "name")
partitioned by (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' --指定每行中字段分隔符为逗号
LINES TERMINATED BY '\n' --指定行分隔符
stored as orc --存储格式
location '/hive/t.db/t';--存储位置
--删除
-- 保留表结构只删除文件,只针对内部表
truncate table t; 
-- 删除内表
drop table t;
-- 删除外表
ALTER TABLE t1 SET TBLPROPERTIES('EXTERNAL'='False');
drop table t1;
--修改表名
alter table t rename TO t1;
-- 修改字段名
alter table t change column col_old_name col_new_name column_type [COMMENT col_comment] after column_name;
-- 增加字段
alter table table_name add columns (column_new_name column_new_type [comment 'comment'])
-- 更新列
alter table table_name replace columns (column_new_name new_type)
-- 增加分区
alter table t add partition (dt='2020');
-- 删除分区
alter table t drop partition (dt='2020');
-- 更改分区
alter table t partition partition_spec CHANGE [COLUMN] col_old_name col_new_name column_type COMMENT col_comment FIRST|AFTER column_name] [CASCADE|RESTRICT];

ALTER DATABASE ... SET LOCATION语句不会将数据库当前目录的内容移动到新指定的位置。 它不会更改与指定数据库下任何表/分区关联的位置。 它仅更改默认的父目录,在该目录中将为此数据库添加新表。 此行为类似于更改表目录不会将现有分区移动到其他位置。

ALTER DATABASE ... SET MANAGEDLOCATION语句不会将数据库的托管表目录的内容移动到新指定的位置。 它不会更改与指定数据库下任何表/分区关联的位置。 它仅更改默认的父目录,在该目录中将为此数据库添加新表。 此行为类似于更改表目录不会将现有分区移动到其他位置。

关于数据库的其他元数据无法更改。

Sort/Order/Cluster/Distribute/Group

select id,name from t1 order by id (asc/desc);
select id,name from t1 sort by id (asc/desc);

order by是全局排序 sort by只是确保每个reduce上面输出的数据有序。如果只有一个reduce时,和order by作用一样。

select id,name from t1 cluster by id;
select id,name from t1 distributeby id;
select id,name from t1 group by id;

 distribute by与group by 的区别

都是按key值划分数据 都使用reduce操作 **唯一不同的是,distribute by只是单纯的分散数据,distribute by col 

 按照col列把数据分散到不同的reduce。而group by把相同key的数据聚集到一起,后续必须是聚合操作。

row_number()/rank()/dense_rank()

select id,name,rank() over(partition by id order by score desc) as rank from t1;
select id,name,row_number() over(partition by id order by score desc) as rank from t1;
select id,name,dense_rank() over(partition by id order by score desc) as rank from t1;

 三个函数相当于group by 之后再来个order by.

row_number()仅仅是加了序号;

rank() 可以显示相同的数据,下一名的排序+1,即为跳跃排序;

dense_rank(),即使有相同的数据,也会按照连续排序

条件判断函数

IF,COALESCE,CASE WHEN
if(boolean testCondition, T valueTrue, T valueFalse Or Null)

if(boolean testCondition, T valueTrue, T valueFalse Or Null)
select if(a=a,’bbbb’,111);
bbbb
当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull

nvl(T value, T default_value)
select nvl(principal,1);
如果value值为NULL就返回default_value,否则返回value,主要功能就是实现null值替换。

CASE a WHEN b THEN c [WHENd THEN e]* [ELSE f] END
case a when a<0 then -1 when a>0 then 1 else 2 end;

CASE WHEN a THEN b [WHEN cTHEN d]* [ELSE e] END
case when a=b then 1 when a>b then 2 else 3 end

is null和is not null

insert/load

-- 本人的hive版本是这样
-- 写入
insert into t1(a,b,c) select a,b,b from t;
insert into t(a,b,c) values(a,b,c);
-- 去掉为null的行
insert overwrite table student select * from student where id is not null;
-- 本地导入 没有local,直接搬移元数据,有local元数据
load data (local) inpath '/home/hadoop/1.txt' into table t;
-- hdfs导入
load data inpath '/home/hadoop/1.txt' into table t;
-- 坑位
"orcfile为压缩格式,可以节约大量存储空间,
但orc还有个特点就是不能直接load数据!
要想load数据,我们要建一个存储格式为textfile的中间表"
-- add patition也可以向表内写数据
alter table itemdt add if not exists partition(dt='20211004') location 'file:///home/spark/rec_item';
alter table itemdt add if not exists partition(dt='20211005') location 'hdfs:///tmp/itemrec';

行列转换

-- 行列转换
select id,tag,tag_new
from t_row_to_column_tmp
lateral view explode(split(tag, ',')) num as tag_new
-- 列行转换
select id,
concat_ws(',',collect_set(tag_new)) as tag_col
from t_column_to_row
group by id;

join

SELECT * from t  WHERE runoob_author LIKE '%COM';
select * from t where conditions order by colu_name limit 3;
-- 可以使用max,min,count
select max(a) as a, max(b) as b, count(c) from group by name;
-- 外联
select a.id,a.name,b.age
from  a
left/right/full outer join  b
on (a.id = b.id);
-- 以LEFT SEMI JOIN关键字前面的表为主表,返回主表的KEY也在副表中的记录
select a.id,a.name,b.age
from  a
left semi join  b
on (a.id = b.id);
-- 返回两个表的笛卡尔积结果,及全组合
select a.id,a.name,b.age
from  a cross join  b
on (a.id = b.id);
-- case when
select t.name,
case when (t.dt='2020.1') then '0'
else '1' end from t;

date

-- 返回结束日期减去开始日期的天数
-- 日期转换函数
to_date(string timestamp)
-- 返回值: string

-- 日期比较函数: 
datediff(string enddate, string startdate)
-- 返回值: int

-- 日期增加函数: 
date_add(string startdate, int days)
-- 返回值: string

-- 日期减少函数: 
date_sub (string startdate, int days)
-- 返回值: string

SELECT CURRENT_DATE;

--- 月份差
select int(datediff(current_date,'2019-9-30')/30);

---2017-06-15
 
SELECT CURRENT_TIMESTAMP;

--2017-06-15 19:54:44
 
SELECT from_unixtime(unix_timestamp());

--2017-06-15 19:55:04

select from_unixtime(unix_timestamp('20171205','yyyymmdd'),'yyyy-mm-dd') from dual;

--2017-12-05

json

-- json 解析函数
-- 说明:解析 json 的字符串 json_string,返回 path 指定的内容。如果输入的 json 字符串无 效,那么返回 NULL
get_json_object(string json_string, string path)
-- 返回值: string
select id,get_json_object(concat('{',name,'}'),'$.Aa') as a,
get_json_object(concat('{',name,'}'),'$.Bb') as b,dt
from json

select json.id,tmp.a,tmp.b
from zxx.json json
lateral view json_tuple(name,'Aa','Bb')tmp as a,b;

查询结果保存到本地

-- 保存到本地文件
hive -e "select user, login_timestamp from user_login" > /tmp/out.txt

hive -f file.sql > /tmp/out.txt

insert overwrite local directory "/tmp/out/"
row format delimited fields terminated by "\t"                                     
select user, login_time from user_login;

--保存结果到hdfs
insert overwrite directory "/tmp/out/"
row format delimited fields terminated by "\t" 
select user, login_time from user_login;

内外表转换

内部转外部
alter table tableA set TBLPROPERTIES('EXTERNAL'='true')
外部转内部
alter table tableA set TBLPROPERTIES('EXTERNAL'='false')


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值