日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive中 <> 和 != 的区别

發(fā)布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive中 <> 和 != 的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

hive中 <> 和 != 的區(qū)別

以前在建設(shè)數(shù)據(jù)倉庫,處理數(shù)據(jù)的過程中,經(jīng)常反復(fù)使用hive的HQL語句,盡管HQL和SQL語言有很多相同之處,但也并不是說HQL就能通用SQL的語法。在使用過程中要尤為注意。事情經(jīng)過是這樣的,我在把業(yè)務(wù)系統(tǒng)數(shù)據(jù)同步到數(shù)倉(數(shù)據(jù)存儲在Hive)中時,在數(shù)據(jù)匯總層(DWS),對數(shù)據(jù)進(jìn)行匯總處理時,發(fā)現(xiàn)有數(shù)據(jù)丟失的問題,經(jīng)過排查,發(fā)現(xiàn)是在使用 <> 引發(fā)的坑。
Hive 中 != 或 <> 致命陷阱
業(yè)務(wù)場景:把業(yè)務(wù)數(shù)據(jù)抽到ODS層(原始數(shù)據(jù)層)、在DWS層(數(shù)據(jù)匯總層),對多張多表中的數(shù)據(jù)進(jìn)行匯總操作,目的是為了補(bǔ)全各表的多種維度指標(biāo)(維表)。

實際操作:因為是在Hive直接使用HQL語句對多表進(jìn)行Join的關(guān)聯(lián)查詢操作,把處理完成的數(shù)據(jù)寫入到提前建好的表中。跑完SQL以后,對結(jié)果數(shù)據(jù)進(jìn)行驗證,發(fā)現(xiàn)少了數(shù)百萬數(shù)據(jù),問題極其嚴(yán)重(在實際開發(fā)過程中,一定要對結(jié)果進(jìn)行多方面的校驗),開始排查問題。

排查問題:首先是對邏輯進(jìn)行排查。發(fā)現(xiàn)邏輯并無錯誤,之后分解HQL,把每個SQL過濾條件單獨拿出來進(jìn)行驗證,發(fā)現(xiàn)問題。 在使用 <> 產(chǎn)生了坑。

問題思考:在數(shù)倉建設(shè)過程中,因為工作疏忽,忘記了對ODS原始數(shù)據(jù)層的數(shù)據(jù)進(jìn)行處理。因為在把ODS原始數(shù)據(jù)層的數(shù)據(jù)同步到到DWS數(shù)據(jù)匯總層時,并沒有經(jīng)過DWD數(shù)據(jù)明細(xì)層的處理,導(dǎo)致問題出現(xiàn)。

注意:在數(shù)倉建設(shè)過程,因為業(yè)務(wù)數(shù)據(jù)、或日志數(shù)據(jù)、或其他來源的數(shù)據(jù)。因為數(shù)據(jù)往往是很臟亂差的,我們需要對數(shù)據(jù)進(jìn)行清洗操作,也就是ETL過程。但是數(shù)據(jù)倉庫有個指標(biāo)很重要,就是要把原始數(shù)據(jù)原封不動的同步到ODS層,在DWD層對數(shù)據(jù)進(jìn)行簡單處理。比如補(bǔ)全數(shù)據(jù)的操作,對NULL或空值進(jìn)行補(bǔ)值操作。

對!= 或 <>實操驗證
首先,先建一張表,插入數(shù)據(jù):

create table if not exists not_eq_temp values(1,22,‘小李’,‘男’,‘銷售’)(
id int comment ‘id’,
age int comment ‘年齡’,
name string comment ‘姓名’,
sex string comment ‘性別’,
job string comment ‘工作’
);

insert into table not_eq_temp values(1,22,‘小李’,‘男’,‘銷售’);
insert into table not_eq_temp values(2,‘小張’,‘男’,‘’);
insert into table not_eq_temp values(3,26,‘小麗’,‘女’,‘文員’);
insert into table not_eq_temp values(4,22,‘小花’,‘女’,‘行政’);
insert into table not_eq_temp values(5,25,‘小王’,‘男’,‘’);
insert into table not_eq_temp values(6,24,‘小明’,‘男’,‘銷售’);
然后,查詢語句:

select id,age,name,sex,job from not_eq_temp where age <> 22
查詢結(jié)果:

| 3| 26|‘小麗’|‘女’|‘文員’|
| 5| 25|‘小王’|‘男’| ‘’|
| 6| 24|‘小明’|‘男’|‘銷售’|
可以看出來,id為2的這行數(shù)據(jù),在查詢過程中丟失了。因為這行數(shù)據(jù),年齡沒有采集到,為空,在使用<>時,會把為null值的也過濾掉,這顯然不是我們想要的結(jié)果。

如何解決使用<>過濾 空值的問題?
方案一

這就需要用到我們前面說的補(bǔ)值操作。在DWD層對缺少或空值的記錄進(jìn)行補(bǔ)值處理。

具體方式:

select
id,
if(age is null,floor(rand()*100+200),age) AS age,
name,
sex,
job
from
not_eq_temp
注意:因為這里age是整數(shù),我們使用floor(rand()*100+200) 來對age進(jìn)行補(bǔ)值操作。這樣做的好處是,使用rand()隨機(jī)函數(shù),有效避免數(shù)據(jù)傾斜情況的出現(xiàn)。

加200的目的,是為了跟正常年齡進(jìn)行區(qū)別。在后續(xù)數(shù)據(jù)使用中,當(dāng)我們看到200歲(目前來說沒人能活200歲)以上的目標(biāo)時,就能第一時間知道,這是我們補(bǔ)的值,原始業(yè)務(wù)數(shù)據(jù)并沒有采集到年齡。

這只是一種情況,大家可以靈活使用。字段類型是字符串或其他類型時,補(bǔ)充對應(yīng)類型的值就行。千萬注意不要補(bǔ)同樣的值,最好是隨機(jī)數(shù)。

方案二

如果我們沒有進(jìn)行DWD層的操作,也就是沒有補(bǔ)值操作。我們在查詢數(shù)據(jù)的時候,可以使用條件判斷避免出現(xiàn)null值被過濾的情況。

具體方式:

select id ,age ,name ,sex ,job from not_eq_temp where coalesce(age,1) <> 22
coalesce的用法,相當(dāng)于if(expr is null,expr1,expr2)。

當(dāng)然還有其他很多方式,我們可以在工作中,自己嘗試。但是還是建議使用第一種方式,在DWD層對臟數(shù)據(jù)進(jìn)行處理,因為這是建設(shè)數(shù)據(jù)倉庫過程中很嚴(yán)格的規(guī)范要求。數(shù)據(jù)倉庫中,一般dwd層就是用來對ods層數(shù)據(jù)進(jìn)行簡單處理的,如果不發(fā)揮這層的作用,那就有點不合時宜了。

使用不等值!= 或<>需要注意
在使用不等值:<>比較或過濾數(shù)據(jù)時,需要注意以下多種情況。

先來看看<>語法格式:

語法: A <> B

針對所有基本類型,如果表達(dá)式A為NULL,或者表達(dá)式B為NULL,返回NULL;如果表達(dá)式A與表達(dá)式B不相等,則為TRUE;否則為FALSE。

注意:在關(guān)系型數(shù)據(jù)庫中,通常SQL的寫法中不等于也可以這樣寫 != 。但在hive中,當(dāng)一個string類型和int類型在進(jìn)行比較的時候會查不出來結(jié)果。

數(shù)字和數(shù)字類型:可以用 != 比較;
帶引號的數(shù)字和數(shù)字類型:也可以用!= 比較;
帶引號的數(shù)字和帶引號數(shù)字類型:還可以用 != 比較;
字符串和數(shù)字類型:不可以用 != 比較;
字符串和數(shù)字類型:不可以用 <> 比較;
總而言之,在使用!= 或 <>比較的時候兩者的字段類型盡量保持一致

總結(jié)

以上是生活随笔為你收集整理的hive中 <> 和 != 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。