工作中使用HQL踩得坑

1 distinct

語句:select distinct uid,gender …
錯誤理解:distinct只會將緊跟在distinct後的第一個字段去重。
正確理解:distinct會按照後面的所有字段,去重。

select distinct uid,gender ...

結果

uid gender
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
uid gender
null
uid telephone car
null 1302132123 736478263

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分區中,這必然是錯誤的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章