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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HIVE User Guide 总结之四HIVE 的MAP/REDUCE、注意点

發(fā)布時(shí)間:2024/1/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HIVE User Guide 总结之四HIVE 的MAP/REDUCE、注意点 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

7.HIVE 的MAP/REDUCE

7.1 jion

????對(duì)于 JOIN 操作:

INSERT?OVERWRITE?TABLE?pv_users? SELECT?pv.pageid,?u.age?FROM?page_view?pv?JOIN?user?u?ON?(pv.userid?=?u.userid);

???實(shí)現(xiàn)過程為:

  • Map

    • JOIN ON 條件中的列作為 Key,如果有多個(gè)列,則 Key 是這些列的組合

    • JOIN 之后所關(guān)心的列作為 Value,當(dāng)有多個(gè)列時(shí),Value 是這些列的組合。在 Value 中還會(huì)包含表的 Tag 信息,用于標(biāo)明此 Value 對(duì)應(yīng)于哪個(gè)表。

    • 按照 Key 進(jìn)行排序。

  • Shuffle

    • 根據(jù) Key 的值進(jìn)行 Hash,并將 Key/Value 對(duì)按照 Hash 值推至不同對(duì) Reduce 中。

  • Reduce

    • Reducer 根據(jù) Key 值進(jìn)行 Join 操作,并且通過 Tag 來識(shí)別不同的表中的數(shù)據(jù)。

????具體實(shí)現(xiàn)過程如圖:

????

7.2 GROUP BY

SELECT?pageid,?age,?count(1)?FROM?pv_users?GROUP?BY?pageid,?age;

7.3 DISTINCT

SELECT?age,?count(distinct?pageid)?FROM?pv_users?GROUP?BY?age;

? 實(shí)現(xiàn)過程如圖:

8.使用HIVE注意點(diǎn)

8.1字符集

????Hadoop和Hive都是用UTF-8編碼的,所以,?所有中文必須是UTF-8編碼,?才能正常使用。

????備注:中文數(shù)據(jù)load到表里面,?如果字符集不同,很有可能全是亂碼需要做轉(zhuǎn)碼的,?但是hive本身沒有函數(shù)來做這個(gè)

????? 8.2 壓縮

??????????hive.exec.compress.output?這個(gè)參數(shù),?默認(rèn)是?false,但是很多時(shí)候貌似要單獨(dú)顯式設(shè)置一遍,否則會(huì)對(duì)結(jié)果做壓縮的,如果你的這個(gè)文件后面還要在hadoop下直接操作,?那么就不能壓縮了

????? 8.3 count(distinct)

???????? 當(dāng)前的 Hive 不支持在一條查詢語句中有多 Distinct。如果要在 Hive 查詢語句中實(shí)現(xiàn)多Distinct,需要使用至少 n+1 條查詢語句(ndistinct的數(shù)目),前 n 條查詢分 別對(duì) n 個(gè)列去重,最后一條查詢語句對(duì) n 個(gè)去重之后的列做 Join 操作,得到最終結(jié)果。

??????8.4 Join

?????????只支持等值連接

??????8.5? DML操作

????? 只支持INSERT/LOAD操作,無UPDATEDELTE

????? 8.6 HAVING

???????? 不支持HAVING操作。如果需要這個(gè)功能要嵌套一個(gè)子查詢用where限制

??????8.7 子查詢

?????????Hive不支持where子句中的子查詢

????? 8.8?Join中處理null值的語義區(qū)別

???????? SQL標(biāo)準(zhǔn)中,任何對(duì)null的操作(數(shù)值比較,字符串操作等)結(jié)果都為nullHive對(duì)null值處理的邏輯和標(biāo)準(zhǔn)基本一致,除了Join時(shí)的特殊邏輯。

????這里的特殊邏輯指的是,HiveJoin中,作為Join key的字段比較,null=null是有意義的,且返回值為true。檢查以下查詢

select?u.uid,?count(u.uid)? from?t_weblog?l?join?t_user?u?on?(l.uid?=?u.uid)?group?by?u.uid;

????????查詢中,t_weblog表中uid為空的記錄將和t_user表中uid為空的記錄做連接,即l.uid = u.uid=null成立。

如果需要與標(biāo)準(zhǔn)一致的語義,我們需要改寫查詢手動(dòng)過濾null值的情況:

select?u.uid,?count(u.uid)? from?t_weblog?l?join?t_user?u?on?(l.uid?=?u.uid?and?l.uid?is?not?null?and?u.uid?is?not?null) group?by?u.uid;

????????實(shí)踐中,這一語義區(qū)別也是經(jīng)常導(dǎo)致數(shù)據(jù)傾斜的原因之一。

????? 8.9 分號(hào)字符

????????分號(hào)是SQL語句結(jié)束標(biāo)記,在HiveQL中也是,但是在HiveQL中,對(duì)分號(hào)的識(shí)別沒有那么智慧,例如:

select?concat(cookie_id,concat(';',’zoo’))?from?c02_clickstat_fatdt1?limit?2;FAILED:?Parse?Error:?line?0:-1?cannot?recognize?input?'<EOF>'?in?function?specification 可以推斷,Hive解析語句的時(shí)候,只要遇到分號(hào)就認(rèn)為語句結(jié)束,而無論是否用引號(hào)包含起來。

????????解決的辦法是,使用分號(hào)的八進(jìn)制的ASCII碼進(jìn)行轉(zhuǎn)義,那么上述語句應(yīng)寫成:

select?concat(cookie_id,concat('\073','zoo'))?from?c02_clickstat_fatdt1?limit?2;

????????為什么是八進(jìn)制ASCII碼?

????我嘗試用十六進(jìn)制的ASCII碼,但Hive會(huì)將其視為字符串處理并未轉(zhuǎn)義,好像僅支持八進(jìn)制,原因不詳。這個(gè)規(guī)則也適用于其他非SELECT語句,如CREATE TABLE中需要定義分隔符,那么對(duì)不可見字符做分隔符就需要用八進(jìn)制的ASCII碼來轉(zhuǎn)義。

??????8.10 Insert

???????? 1. 新增數(shù)據(jù)

????????????根據(jù)語法Insert必須加“OVERWRITE”關(guān)鍵字,也就是說每一次插入都是一次重寫。那如何實(shí)現(xiàn)表中新增數(shù)據(jù)呢?

????? 假設(shè)Hive中有表xiaojun1,

hive>?DESCRIBE?xiaojun1; OK id?int value?int hive>?SELECT?*?FROM?xiaojun1; OK 3?4 1?2 2?3

???????????? 現(xiàn)增加一條記錄:

hive>?INSERT?OVERWRITE?TABLE?xiaojun1? SELECT?id,?value?FROM?(SELECT?id,?value?FROM?xiaojun1?UNION?ALL?SELECT?4?AS?id,?5?AS?value?FROM?xiaojun1?limit?1 )?u; 結(jié)果是:? hive>SELECT?*?FROM?p1;? OK 3?4 4?5 2?3 1?2

????????????其中的關(guān)鍵在于, 關(guān)鍵字UNION ALL的應(yīng)用, 即將原有數(shù)據(jù)集和新增數(shù)據(jù)集進(jìn)行結(jié)合, 然后重寫表

?????????2.插入次序

????????????INSERT OVERWRITE TABLE在插入數(shù)據(jù)時(shí),是按照后面的SELECT語句中的字段順序插入的. 也就說, 當(dāng)id value 的位置互換, 那么value將被寫入id, id被寫入value.

?????????3. 初始值

????????????INSERT OVERWRITE TABLE在插入數(shù)據(jù)時(shí), 后面的字段的初始值應(yīng)注意與表定義中的一致性. 例如, 當(dāng)為一個(gè)STRING類型字段初始為NULL時(shí):

NULL?AS?field_name?//?這可能會(huì)被提示定義類型為STRING,?但這里是void? CAST(NULL?AS?STRING)?AS?field_name?//?這樣是正確的

???? 又如, 為一個(gè)BIGINT類型的字段初始為0時(shí):

CAST(0?AS?BIGINT)?AS?field_name



jiewei

轉(zhuǎn)載于:https://my.oschina.net/MrMichael/blog/307304

總結(jié)

以上是生活随笔為你收集整理的HIVE User Guide 总结之四HIVE 的MAP/REDUCE、注意点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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