工作中使用HQL踩得坑

1 distinct

语句:select distinct uid,gender …
错误理解:distinct只会将紧跟在distinct后的第一个字段去重。
正确理解:distinct会按照后面的所有字段,去重。

select distinct uid,gender ...

结果

uidgender
10010
10010
10011

2 insert

语句:insert overwrite table a select uid,telephone,gender…
往hdfs中插入数据时,select 后的字段的顺序,必须与目标表a的字段顺序相同。否则,会插入数据,但是字段对应错误。

3 到处到DB的任务中 export(公司中用)

目标表(DB)与Hive表字段名必须一致,不然任务会执行成功,但是数据不会到处。

4 join 后的on语句

4.1 on 语句中的null值

on语句中等式两边的字段,若有null时会出错,因为在SQL中"null = null"结果为unknown。所以须提前处理,再join连接。比如提前为null值赋值。
例如下面的例子,两个表中uid都为null,在连接后就找不到第二个表中的数据了,这时须将两个表中的null都改为字符串’默认’。(实际工作中的需求时,null为默认,须统计默认分组中telephone的数量)

select t1.uid,gender,telephone,car
from
(
  select uid,gender
  from a
)t1 left join 
(
  select uid,telephone,car
  from b
)t2 on t1.uid = t2.uid
uidgender
null
uidtelephonecar
null1302132123736478263

4.2 full join多表连接中的on语句

各on语句后的字段,必须为相邻表中的字段。例如:
错误写法如下:

select t1.uid,gender,telephone,car
from
(
  select uid,gender
  from a
)t1 
full join 
(
  select uid,telephone,car
  from b
)t2 on t1.uid = t2.uid
full join
(
  select uid,telephone,car
  from b
)t3 on t1.uid = t3.uid

正确写法:
full join多表连接,还是使用嵌套吧,即连接两个表,得到结果,再使用结果连接第三个表。

select temp.uid,gender,telephone,car
from(
		select t1.uid,gender,telephone
		from
		(
		  select uid,gender
		  from a
		)t1 
		full join 
		(
		  select uid,telephone
		  from b
		)t2 on t1.uid = t2.uid
)temp
full join
(
  select uid,telephone,car
  from b
)t3 on temp.uid = t3.uid

5 left join中的右表

left join时一定要确认右表中数据是否完整,若有完整的表不用,会致使最终结果缺失数据。
确实,右表的大小不会影响left join语法的正确使用,左表中数据不会丢失,但最终数据缺失了,对一个报表来说,统计出错,一样是错误。
总结:lef join时要确认,是否需要右表是全的,确认右表是否是全的。

6 初始化Hive表

初始化Hive表,用>=获取增量表中的过往数据时,如果需要,一定要记得加上上限(今天)。
错误场景:
Hive表:
|uid|register_time |ymd|
|–|--|
| 10001 |2020-04-07 |2020-04-01|
将注册时间为2020-04-07的用户信息写入到了2020-04-01分区中,这必然是错误的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值