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