近期Hive 使用筆記

最近使用在線數據庫取數平臺,hive SQL,一點小經驗,記錄一下:

1、 datediff()函數:前一個值減去後一個值。

select datediff("2017-06-16 15:00:01","2017-06-15 15:01:01"); --輸出: 1

select datediff("2017-06-16 15:00:01","2017-06-18 16:01:01"); --輸出: -2

2、語句結構問題:

第一種:

select ....

from (...) a

where ...

left join

(....) b

第二種:

select ....

from (...) a

left join

(....) b

where ...

也就是說,左聯結left join放在中間、作為嵌套,還是放在最後、讓代碼行程成塊的模塊,哪種更好?其實,同等條件下,第一種閱讀更清晰順暢。但是,如果where後面的限制中,有涉及表b中的字段,就要用第二種。如果,where中內容不涉及b,可以就用第一種。

3、別名或命名問題:

通常情況下,寫代碼的時候,別名要用英文,不要用中文加單引號的形式,這樣很多情況下會出錯。頂多在最外層、select裡面,別名用中文加單引號,這是用於:給輸出的最終表格、設置直觀的中文列名。

4、left join問題:

對於數據庫裡的寬表等原始表,不能直接聯結等其他動作,例如

select jjr.corp_name

,count(case when (jjr.zj='A1' ) then 1 else null end)`A1人數`

from dw.dw_allinfo_agent_da

left join

(select ...

from .....)

where pt = '20180801000000'

and brand_name ='直營'

and uc_job_name in ('租賃經紀人', '綜合經紀人', '買賣經紀人')

而應該:

left join

(select *

from dw.dw_allinfo_agent_da )形成一個虛擬表。 因為數據庫的表沒有權限做這些行為,必須自己提取出一個虛擬表後,做自己的操作。

5、hive> to_date('2016-12-29 16:37:11') ,得到:2016-12-29

但是!where to_date('sign_time')>='2018-07-01',得到:空值!!

正確:where to_date(sign_time)>='2018-07-01',得到:正確的篩選作用。

另外,case when then else end 語句中,中間的條件儘量不需要用括號,能不加括號就不加括號,免得

括號太多,更易出錯或者匹配不上。--永強的經驗

6、同事習慣使用的寫法:

,count(case when t1.on_job_status_code<>'170007001' then 1 end)`當前在職人數`

也就是說,end前面不加 else null。避免和sum(case when …)中else 1語句混淆。直接不寫。

7、一般的,內層select語句不做聚合,只是構建底層表;最外層的才進行聚合。

最後,摸索使用了這麼些代碼軟件,最後選擇使用"notepad++中文版"作為工作軟件,一是小巧,而是界面設置為白色背景,更符合我的習慣,最後一點就是(敲黑板,重點來了!),按住Ctrl加鼠標滾輪可以放大縮小界面,和Windows系統保持一致,非常方便了!好評,推薦下。


分享到:


相關文章: