hive高頻使用的拼接函數及“避坑”
說到拼接函數應用場景和使用頻次還是非常高,比如一個員工在公司充當多個角色,我們在底層存數的時候往往是多行,但是應用的時候我們通常會只需要一行,角色字段進行拼接,這樣join其他表的時候呢也不會造成數據被重復引用計算。
1、拼接多個字符串concat_null(…)
從上圖中的說明中我們可以看到,在應用場景中,通常使用concat_null(…)防止由于有null存在導致的拼接異常。
2. 用分隔符拼接多個字符串concat_ws(…)
需要注意的是concat_ws(…)可以直接處理掉null,而且如果將sep分割符使用’'(空值),則功能和concat_null(…)一樣。
3、collect_set、collect_list實現列轉行
由于collect_set在實現列轉行的時候進行了去重處理,自然實際應用中應用的也會更多。
4、“避坑” null和非字符串字段
由于在實際生產環境中,我們所使用的引擎有所不同,兼容性也不同。有時候NULL和非字符串字段在查詢時也會出現問題。
1、通常我們可以把null進行替換。if(字段名 is null,‘’,字段名)
2、非字符串轉化為字符串 cast(字段名 as string)
`SELECT id, concat_ws(',',collect_set( cast(if(角色 is null,'',角色) as string) )) AS `角色` -- 將每個id對應多個的角色去重組合放到一行,并使用英文','分隔角色
FROM emp WHERE dt = '20230618' GROUP BY 1 `