Day_01

今天的知识点总结

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容