今天的知识点总结
hive语句中的几个业务要用到的语句:
1.insert overwrite
2.join(left/right)
3.sum(case when)
4.%YYYYMMDD%的含义
5.group by
6.join on 后面加1=1这种形式的语句有什么作用
7.union语句
8.comment 这个就在这说就行了,这就是给一个字段添加一个注解 看这个例子:create table A(
uid int(32) notnull comment '用户id')完了,就是用在这个地方,虽然还没有实践过,但是感觉没有必要浪费时间在这个上面,顶多再说一个命令:show all columns from table A 标示获取A表下的所有字段的注解
个人总结
9.这个也在这说一下就完了,有的时候建表末尾会出现ENGINE=InnoDB default charset=utf8
表示的是数据库引擎使用的是innodb引擎(MySQL数据库引擎的一种),DEFAULT CHARSET=utf8 数据库默认编码为utf-8
AUTO_INCREMENT=1 自增键的起始序号为1
1.insert overwrite :
首先标准的语法格式如下
insert [overwrite/into] table example_01 [partition(partcol1=val1,partcol2=val2 ...)[if not exists]] select statement from example_02
表示将example_02表中的statement字段数据[以覆盖 overwrite]的形式插入到example_01表中[可以指定要操作的表的分区]
覆盖写的意思是如果语句中使用的是overwrite,则如果出现相同的数据,则新数据将会覆盖掉旧的数据
如果语句中没有overwrite的话 insert into默认的情况下叫做追加写,即新的获取到的数据将会追加到数据表中,不会出现覆盖原数据的情况
参考范例:
insert overwrite table login_user select distinct uid from login_log;
//从登录日志表中查询登录用户。将唯一的(distinct 去重)uid字段数据覆盖写到login_user表中
insert overwrite table login_user partition(ds='20130101') select distinct uid from login_log where ds ='20130101';
//在login_log表中先查询到ds为20130101的数据,让后插入高标login_user表的ds=20130101的日期分区中,同样也是覆盖写
insert into table login_user select distinctuid from login_log;
//如果login_user已经有数据了则追加,否则创建
扩展:hive的多表同时插入语句,看下面语句
from resource_table
insert overwrite table table_01[partition (partcol1 =val1,partcol2=val2...)] select statement1
insert overwirte table_02[partition (partcol1 =val1,partcol2=val2...)] select statement2
...
简单的理解来说就是讲数据源表放在语句的开头,追加写就不再写一遍了,没啥意思。
然后说一下动态分区,先截图吧,一个博主写的文章比较简单易懂,
奥,没有字数限制,我秀逗了
接着说大概能看明白这张图,最有价值的也就是那条注意事项了
写一遍吧,加深一下印象
insert overwrite table employees partition (country,state) select * from staged_employees;纯动态
insert overwrite tableemployees partition(country=‘us‘,state) select* fromstaged_employees se where se.country='us'
动态分区的设置参数理解
还是看一下例子吧,比较好懂
一上午过去了,还算是说的过去,下午见
第2个,join(left/right等等)
下面来具体的说一下join一种有几种
1.inner join 内链接
例句select statement from table A inner join table B on A.key=B.key
只会输出两个或多个表共有的数据
2.left (out)join 左(外)连接
select statement from table A left join table B onA.key=B.key
显示左表的所有数据,右表符合的显示,不符合的为null
right(out) join 右(外)连接 同左外连接 不说了 没啥意思
3.full (outer) join 全(外)连接
select statement from table A full outer join table B on A.key=B.key
还有一种比较扯得交叉连接
cross join
生成两张表的笛卡尔积,得到的记录相当于两张表的乘积,结果集合中数据行数等于第一个表中查询条件的数据行数乘以第二个表中符合查询条件的数据行数,使用sql语句如下
select statement from table A cross table B
特别注意的一点在交叉连接后面,不可以使用on 只能是使用where
通常来说,在大表关联的时候,建议使用inner join或者left join,不建议使用cross join或者where(先进行笛卡儿积,在进行选择,效率太低)
第3个 sum(case when)
会大大的优化查询效率,一个博主之前在公司做项目时的一个小案例,我们来体会一下
首先是要建一个订单表
然后原始sql进行查询
奥先说需求,需求:统计某段时间范围内每天的来源编号数量,其中来源编号对应数据表中的o_source字段,字段值可能为CDE,SDE,PDE,CSE,SSE。
然后原始的查询语句如下
这种查询语句的中间过程就是:每一个查询都要进行全表的扫描,第一次优化是把一些字段加上了索引,提高了效率,大概缩短到了5秒
然后就是用我们的sum(case when)语句
这个中间过程他有图,我就不放了,太麻烦,就是显示只进行了一次全表扫描
聚合函数像是sum count max min 等等,注意,可以在一个语句中使用多个聚合函数,但是去重的字段只能是唯一的
再一个,聚合函数后面接上case when 就非常适用于像这个计数型的需求,我们也好理解,代码比较易懂
比如和计算男生女生的个数啊 写个伪代码 大概就是 sum(case when sex='man' then 1 else 0 end) as numofman,
sum(case when sex ='woman' then 1 else 0 end) as numofwoman
from table_gender
第4个没找到答案,大概自己理解的意思是项目中就是讲查询到的数据插入到ds(y一个字段)格式为“YYYYMMDD”日期形式的分区去
跳过吧先,明天问同事,今天先说第5个
group by
先自己写一个小例子,insert overwrite table example_A A partition(‘name’)select * from example_B B group by B.gender
大概意思就是在将在B表中查询到的数据覆盖写到A表中(以name为分区)并且根据性别gender进行分组
注意事项的话,又这么几个,比如说 select 语句和group by 同时使用时,select后面要查询的字段只能是group by后面的字段或者说是聚合函数
例如这个 select a,count(b) from t group by a 这个就是对的 但是 select a,b from t group by a 这个就是错的,因为这个b他什么条件也不符合
收工了,再写一个小tips吧 ,一个处理日期的函数 非常适用于处理存活率
datediff(date1,date2)可相当于date2 -date1,当然了,其中还有许多变形参数,比如说,怎么计算,以天计算还是以小时计算等等,我们都可以进行设置,今天到这吧,byebye