Hive DML学习

前任经验:有些东西要很清晰,不然面试的时候一不留神就挂了。

在关系型数据库里面,insert、update的情况是很多的,但是在大数据上,比如hive里,insert的情况是不多的,基本上都是load。把一个文件或者一批文件load到hive的表里面。

LOAD:

LOAD DATA  [LOCAL]  INPATH  'filepath'  [OVERWRITE]  INTO TABLE tablename  [PARTITION (partcol1=val1, partcol2=val2 ...)]

LOCAL:表示从linux上加载数据  不选local表示从hdfs上加载数据

filepath:表示文件的路径

OVERWRITE :表示是否覆盖表里的内容,不选overwrite表示,把数据追加到表里。

PARTITION :分区

先创建一张表:

create table dept(
deptno int,
dname string,
location string
) row format delimited fields terminated by '\t';

然后加载数据到dept表里面:

LOAD DATA LOCAL INPATH '/home/hadoop/data/dept.txt' OVERWRITE INTO TABLE dept;
LOAD DATA LOCAL INPATH '/home/hadoop/data/dept.txt' INTO TABLE dept;
覆盖和追加

从上面可以看出没有overwrite和没有overwrite的区别。

下面试一下,从hdfs上加载数据到表里面:

先把数据放到hdfs上:

然后加载数据到dept表里面:

LOAD DATA INPATH '/hive/dept/dept.txt' OVERWRITE INTO TABLE dept;

然后再看hdfs上的dept.txt文件,发现没有了:

(它被移到dept这张表默认的hdfs的路径下了,这里是:hdfs://10-9-140-90:9000/user/hive/warehouse/d6_test.db/dept)

下面试一下,把hive上查询的结果写到linux本地或者hdfs上:

写到linux本地:

INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/data/emptmp'
row format delimited fields terminated by ','
SELECT empno,ename FROM emp;

写到hdfs上(把LOCAL去掉即可):

INSERT OVERWRITE  DIRECTORY '/emptmp'
row format delimited fields terminated by ','
SELECT empno,ename FROM emp;

不进入hive直接查询表:

hive -e 和hive -f的使用

hive -e "select * from d6_test.emp"   或者

hive -e "use d6_test; select * from emp"

这种不进入hive就可以查询表的情况适合?适合写脚本,比如写一个脚本,在里面写hive语句:

可以hive -f查看一下:看一下下面说明:

hive -f 的使用:

从上面可以看出,可以把一大堆sql写到一个sql文件里面,然后用hive -f去执行这个sql文件。

然后如果每天需要执行一次,crontab -e  ,添加一个计划即可。

hive里的清屏:!clear

聚合函数:max min sum count avg   多进一出

每个部门的平均工资
1) 拿到每个部分的信息
2) 在1)的基础之上求平均工资

select deptno,avg(sal) from emp group by deptno;

出现select中的字段要么出现在group by中,要么出现在聚合函数中

select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal >=2000;

case when then 常用于报表中:

select ename, sal, 
case 
when sal > 1 and sal <=1000 then 'lower'
when sal > 1000 and sal <=2000 then 'middle'
when sal > 2000 and sal <=3000 then 'high'
else 'highest' end
from emp;

(没有走MapReduce)

函数 build-in(内置的函数:hive本身自带的函数)     外置的函数:自定义的函数

看官网,在这里面可以找到相应的函数以及使用说明:

在hive里面使用: show functions;   可以看到hive所有内置的函数:

desc function 函数名称;   可以查看这个函数的相关说明:

create table dual(x string );

insert into table dual value('');(造数据)

select abs(-9) from dual;

如果再看详细点的信息,可以这样:desc function extended 函数名称;     有范例example:

(官网)

时间相关的函数:

当前时间:current_date

当前具体时间:current_timestamp

时间戳:unix_timestamp()

unix_timestamp()时间戳可以传入参数进行转换。比如:

 select unix_timestamp(('2019-03-09 13:41:15.841', 'yyyy-MM-dd hh:mm:ss') from dual;

(加10天,减10天)

求每个月月底:

其它函数:

round() 四舍五入

ceil(x)  取不小于x的最小整数

floor(x) 取不大于x的最大整数

substr()   取子字符串

concat() 连接多个字符串

concat_ws()  连接两个字符串(有分隔符)

split()   根据分隔符去拆分字符串

substr("abcdef",4)

 substr("abcdef",4,2)

concat("abc","def","ghijk") 

 concat_ws("---","abc","def","gh")(可以多个)

如果现在去解析,   ip:port  这个,需要把ip和port给分开。需要split()

split("192.168.11.11:8020",":")

split("192.168.11.11","\\.") (\\是转义字符)

create table hive_wc(sentence string);
load data local inpath '/home/hadoop/data/hive_wc.txt' into table hive_wc;

这表里面有三行,每一行都是一串字符串,现在想把它们分隔开:

select split(sentence,"\t") from hive_wc;

(每一行变成了数组形式)

现在已经把它们分隔开了,但是我们如果想要的结果是下面这样子:

hello
world
hello
hello
world
welcome
hello

这属于行转列、列转行。(一个非常经典的面试题目)

需要借助一个函数;explode

select explode(split(sentence,"\t")) from hive_wc;

再进行分组,count,就可以计算出wordcount了:

select word,count(1) from (select explode(split(sentence,"\t")) as word from hive_wc)t group by word;


select word, count(1) as count 
from
(select explode(split(sentence, "\t")) as word from hive_wc ) t
group by word
order by count desc;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值