Hive中使用 != 或 <>符號(hào)進(jìn)行條件過(guò)濾時(shí)踩坑記錄

處理數(shù)據(jù)的過(guò)程中派阱,經(jīng)常反復(fù)使用hive的HQL語(yǔ)句跋涣,盡管HQL和SQL語(yǔ)言有很多相同之處阅懦,但也并不是說(shuō)HQL就能通用SQL的語(yǔ)法和二。在使用過(guò)程中要尤為注意。事情經(jīng)過(guò)是這樣的耳胎,我在把業(yè)務(wù)系統(tǒng)數(shù)據(jù)同步到數(shù)倉(cāng)(數(shù)據(jù)存儲(chǔ)在Hive)中時(shí)惯吕,在數(shù)據(jù)匯總層(DWS)惕它,對(duì)數(shù)據(jù)進(jìn)行匯總處理時(shí),發(fā)現(xiàn)有數(shù)據(jù)丟失的問(wèn)題废登,經(jīng)過(guò)排查怠缸,發(fā)現(xiàn)是在使用 <> 引發(fā)的坑。

Hive 中 != 或 <> 致命陷阱

業(yè)務(wù)場(chǎng)景:把業(yè)務(wù)數(shù)據(jù)抽到ODS層(原始數(shù)據(jù)層)钳宪、在DWS層(數(shù)據(jù)匯總層),對(duì)多張多表中的數(shù)據(jù)進(jìn)行匯總操作扳炬,目的是為了補(bǔ)全各表的多種維度指標(biāo)(維表)吏颖。

實(shí)際操作:因?yàn)槭窃贖ive直接使用HQL語(yǔ)句對(duì)多表進(jìn)行Join的關(guān)聯(lián)查詢操作,把處理完成的數(shù)據(jù)寫入到提前建好的表中恨樟。跑完SQL以后半醉,對(duì)結(jié)果數(shù)據(jù)進(jìn)行驗(yàn)證,發(fā)現(xiàn)少了數(shù)百萬(wàn)數(shù)據(jù)劝术,問(wèn)題極其嚴(yán)重(在實(shí)際開(kāi)發(fā)過(guò)程中缩多,一定要對(duì)結(jié)果進(jìn)行多方面的校驗(yàn)),開(kāi)始排查問(wèn)題养晋。

排查問(wèn)題:首先是對(duì)邏輯進(jìn)行排查衬吆。發(fā)現(xiàn)邏輯并無(wú)錯(cuò)誤,之后分解HQL绳泉,把每個(gè)SQL過(guò)濾條件單獨(dú)拿出來(lái)進(jìn)行驗(yàn)證逊抡,發(fā)現(xiàn)問(wèn)題。 在使用 <> 產(chǎn)生了坑零酪。

問(wèn)題思考:在數(shù)倉(cāng)建設(shè)過(guò)程中冒嫡,因?yàn)楣ぷ魇韬觯浟藢?duì)ODS原始數(shù)據(jù)層的數(shù)據(jù)進(jìn)行處理四苇。因?yàn)樵诎袿DS原始數(shù)據(jù)層的數(shù)據(jù)同步到到DWS數(shù)據(jù)匯總層時(shí)孝凌,并沒(méi)有經(jīng)過(guò)DWD數(shù)據(jù)明細(xì)層的處理,導(dǎo)致問(wèn)題出現(xiàn)月腋。

注意:在數(shù)倉(cāng)建設(shè)過(guò)程蟀架,因?yàn)闃I(yè)務(wù)數(shù)據(jù)、或日志數(shù)據(jù)罗售、或其他來(lái)源的數(shù)據(jù)辜窑。因?yàn)閿?shù)據(jù)往往是很臟亂差的,我們需要對(duì)數(shù)據(jù)進(jìn)行清洗操作寨躁,也就是ETL過(guò)程穆碎。但是數(shù)據(jù)倉(cāng)庫(kù)有個(gè)指標(biāo)很重要,就是要把原始數(shù)據(jù)原封不動(dòng)的同步到ODS層职恳,在DWD層對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理所禀。比如補(bǔ)全數(shù)據(jù)的操作方面,對(duì)NULL或空值進(jìn)行補(bǔ)值操作。

對(duì)!= 或 <>實(shí)操驗(yàn)證
首先色徘,先建一張表恭金,插入數(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,'小明','男','銷售')遍搞;

SQL語(yǔ)句:

select id,age,name,sex,job from not_eq_temp where age <> 22

查詢結(jié)果:

| 3| 26|'小麗'|'女'|'文員'|
| 5| 25|'小王'|'男'| ''|
| 6| 24|'小明'|'男'|'銷售'|

如何解決使用<>過(guò)濾 空值的問(wèn)題?

方案一:補(bǔ)值
(1)通過(guò)使用 nvl (age, 0)

(2) if(age is null, floor(rand()*100+200), age) AS age

注意:因?yàn)檫@里age是整數(shù)罗侯,我們使用floor(rand()*100+200) 來(lái)對(duì)age進(jìn)行補(bǔ)值操作。這樣做的好處是溪猿,使用rand()隨機(jī)函數(shù)钩杰,有效避免數(shù)據(jù)傾斜情況的出現(xiàn)。

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

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

(4)coalesce(age,1)

(3)字段值為null若為臟數(shù)據(jù)蝌借,可剔除。

方案二:
若仍保留null值指蚁,判斷條件可以為:

select id,age,name,sex,job from not_eq_temp where (age <> 22 or age is null )

另外:使用不等值!= 或<>需要注意的

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

先來(lái)看看<>語(yǔ)法格式:

語(yǔ)法: A <> B

針對(duì)所有基本類型凝化,如果表達(dá)式A為NULL稍坯,或者表達(dá)式B為NULL,返回NULL;如果表達(dá)式A與表達(dá)式B不相等瞧哟,則為TRUE混巧;否則為FALSE。

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

數(shù)字和數(shù)字類型:可以用 != 比較傍衡;

帶引號(hào)的數(shù)字和數(shù)字類型:也可以用!= 比較;

帶引號(hào)的數(shù)字和帶引號(hào)數(shù)字類型:還可以用 != 比較负蠕;

字符串和數(shù)字類型:不可以用 != 比較聪舒;

字符串和數(shù)字類型:不可以用 <> 比較;

總而言之虐急,在使用!= 或 <>比較的時(shí)候兩者的字段類型盡量保持一致。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滔迈,一起剝皮案震驚了整個(gè)濱河市止吁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燎悍,老刑警劉巖敬惦,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谈山,居然都是意外死亡俄删,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奏路,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畴椰,“玉大人,你說(shuō)我怎么就攤上這事鸽粉⌒敝” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵触机,是天一觀的道長(zhǎng)帚戳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)儡首,這世上最難降的妖魔是什么片任? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔬胯,結(jié)果婚禮上对供,老公的妹妹穿的比我還像新娘。我一直安慰自己氛濒,他們只是感情好犁钟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布棱诱。 她就那樣靜靜地躺著,像睡著了一般涝动。 火紅的嫁衣襯著肌膚如雪迈勋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天醋粟,我揣著相機(jī)與錄音靡菇,去河邊找鬼。 笑死米愿,一個(gè)胖子當(dāng)著我的面吹牛厦凤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播育苟,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼较鼓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了违柏?” 一聲冷哼從身側(cè)響起博烂,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漱竖,沒(méi)想到半個(gè)月后禽篱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馍惹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年躺率,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片万矾。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悼吱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出良狈,到底是詐尸還是另有隱情舆绎,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布们颜,位于F島的核電站吕朵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窥突。R本人自食惡果不足惜努溃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阻问。 院中可真熱鬧梧税,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凳谦,卻和暖如春忆畅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尸执。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工家凯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人如失。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓绊诲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親褪贵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掂之,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容