hive中條件判斷函數if/COALESCE/CASE/

?If函數: if
?非空查找函數: COALESCE
?條件判斷函數:CASE

? If 函數

語法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
返回值: T
說明:  當條件testCondition為TRUE時刻蟹,返回valueTrue风皿;否則返回valueFalseOrNull
舉例:
hive> select if(1=2,100,200) from dual;
200
hive> select if(1=1,100,200) from dual;
100

? 非空查找函數 : COALESCE

COALESCE使用時和AS搭配使用而柑,對于合并數據列非常有用鳄哭。

語法: COALESCE(T v1, T v2, …)
返回值: T
說明:  返回參數中的第一個非空值江解;如果所有值都為NULL睛挚,那么返回NULL
舉例:
hive> select COALESCE(null,'100','50′) from dual;
100

條件判斷函數: CASE

語法 : CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
返回值 : T
說明:如果 a 等于 b ,那么返回 c 蜂大;如果 a 等于 d ,那么返回 e 蝶怔;否則返回 f
舉例:
hive> Select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end from dual;
mary

code例子

############################################################################
'''
# function:求取篩選字段
# 功能:求取兩個表的存儲字段奶浦,先取第一個表特有的字段,再取第二個表特有的字段踢星,最后取兩個表字段的交集(如果第一個表的該字段的值為空澳叉,則取第二個該字段的該值)
# 創(chuàng)建時間:2017/08/16
'''
#############################################################################  

def colChoose(first_tb,second_tb):
    """兩個表字段的全集等于兩個表之間相互之間的差集和一個交集這三者之和"""
    # 構建需要篩選的差集
    col_difference_A = str(",".join([tmp for tmp in ['A.' + 
                              i for i in list(set(hiveContext.sql("SELECT * FROM %s"%first_tb).columns). \
                difference(set(hiveContext.sql("SELECT * FROM %s"%second_tb).columns)))]]))
    
    col_difference_B = str(",".join([tmp for tmp in ['B.' + 
                              i for i in list(set(hiveContext.sql("SELECT * FROM %s"%second_tb).columns). \
                difference(set(hiveContext.sql("SELECT * FROM %s"%first_tb).columns)))]]))
    
    # 求兩個表之間的交集
    col_intersection_A = [tmp for tmp in ['A.' + i for i in list(set(hiveContext.sql("SELECT * FROM %s"%first_tb).columns).intersection(
                                                                set(hiveContext.sql("SELECT * FROM %s"%second_tb).columns)))]]
    
    col_intersection_B = [tmp for tmp in ['B.' +i for i in list(set(hiveContext.sql("SELECT * FROM %s"%first_tb).columns).intersection(
                                                                set(hiveContext.sql("SELECT * FROM %s"%second_tb).columns)))]]
    
    col_intersection = [i for i in list(set(hiveContext.sql("SELECT * FROM %s"%first_tb).columns).intersection(
                                        set(hiveContext.sql("SELECT * FROM %s"%second_tb).columns)))]
    # col_intersection_AB = str(",".join([tmp for tmp in ["COALESCE" + str(i) for i in map(None, col_intersection_A,col_intersection_B)]]))
    # col_intersection_AB = str(",".join([tmp for tmp in list(map(lambda x,y : x + " " + "AS" + " " + y, ["COALESCE" + str(i) for i in map(None, col_intersection_A,col_intersection_B)],col_intersection))]))
    col_intersection_AB = str(",".join([tmp for tmp in list(map(lambda x,y,z : "COALESCE(" + x + "," + y + ")" + " " + "AS" + " " + z, col_intersection_A,col_intersection_B,col_intersection))]))
    # col_interset = str(",".join([tmp for tmp in ["IFNULL" + str(i) for i in map(None, col_interset_A,col_interset_B)]]))     sql語句中含有IFNULL,hive中并沒有沐悦,hive中用COALESCE成洗。
    
    return col_difference_A,col_difference_B,col_intersection_AB
# 使用示例
# 1. colChoose("tb_source_data.loan_applications","tb_source_data.user_profiles")
# 2. print colChoose("tb_source_data.loan_applications","tb_source_data.user_profiles")
# 3. 其他函數調用:col_difference_A,col_difference_B,col_intersection_AB=colChoose(first_tb,second_tb)
############################################################################
'''
# function:join_two_tables
# 功能:可以用來聚合loan_application和user_profiles的三張表,(包含loan_application&user_profiles,nanyue_loan_application&nanyue_user_profiles,partner_loan_application&partner_user_profiles)
# 創(chuàng)建時間:2017/08/11 修改時間:2017/08/16
'''
#############################################################################    
def joinLoanApp_UserProfilesTable(first_tb,second_tb,store_tb,first_tb_on_col,second_tb_on_col,joinway):
    begin = datetime.datetime.now()
    hiveContext.sql("DROP TABLE IF EXISTS %s PURGE"%store_tb)
    col_difference_A, col_difference_B, col_intersection_AB = colChoose(first_tb,second_tb)

    sql_join = """
    SELECT %s, %s, %s
    FROM
    (SELECT * FROM
    (SELECT *, row_number() OVER (PARTITION BY %s ORDER BY created_at DESC) AS num FROM %s) t1
    WHERE t1.num=1 AND %s IS NOT NULL) A 
    %s JOIN
    (SELECT * FROM
    (SELECT *, row_number() OVER (PARTITION BY %s ORDER BY created_at DESC) AS num FROM %s) t2
    WHERE t2.num=1 AND %s IS NOT NULL) B 
    ON A.%s=B.%s """%(col_difference_A, col_difference_B, col_intersection_AB, first_tb_on_col, first_tb, first_tb_on_col,joinway, second_tb_on_col, second_tb, second_tb_on_col, first_tb_on_col, second_tb_on_col)
    print "-----------建表語句-----------"
    print sql_join
    
    print "-----------開始join表-----------"
    hiveContext.sql(sql_join).write.saveAsTable("%s"%store_tb)
    print "-----------join表結束-----------"
    
    end = datetime.datetime.now()
    print "耗時:",end-begin

# 使用示例
# joinLoanApp_UserProfilesTable("tb_source_data.loan_applications","tb_source_data.user_profiles","stage_data.loan_application_join_user_profiles","user_profile_id","id","FULL")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末藏否,一起剝皮案震驚了整個濱河市瓶殃,隨后出現的幾起案子,更是在濱河造成了極大的恐慌副签,老刑警劉巖遥椿,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異继薛,居然都是意外死亡修壕,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門遏考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慈鸠,“玉大人,你說我怎么就攤上這事∏嗤牛” “怎么了譬巫?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長督笆。 經常有香客問我芦昔,道長,這世上最難降的妖魔是什么娃肿? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任咕缎,我火速辦了婚禮,結果婚禮上料扰,老公的妹妹穿的比我還像新娘凭豪。我一直安慰自己,他們只是感情好晒杈,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布嫂伞。 她就那樣靜靜地躺著,像睡著了一般拯钻。 火紅的嫁衣襯著肌膚如雪帖努。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天粪般,我揣著相機與錄音拼余,去河邊找鬼。 笑死刊驴,一個胖子當著我的面吹牛姿搜,可吹牛的內容都是我干的。 我是一名探鬼主播捆憎,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼舅柜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躲惰?” 一聲冷哼從身側響起致份,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎础拨,沒想到半個月后氮块,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡诡宗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年滔蝉,在試婚紗的時候發(fā)現自己被綠了摄闸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤渐。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抱怔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情螃概,我是刑警寧澤矫夯,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吊洼,受9級特大地震影響训貌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜冒窍,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一递沪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧综液,春花似錦区拳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽约素。三九已至届良,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圣猎,已是汗流浹背士葫。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留送悔,地道東北人慢显。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像欠啤,于是被迫代替她去往敵國和親荚藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容