您好,登錄后才能下訂單哦!
本篇文章為大家展示了hive+python數(shù)據(jù)分析是怎么入門的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
舉個(gè)例子,
當(dāng)年沒(méi)有數(shù)據(jù)庫(kù)的時(shí)候, 人們通過(guò)編程來(lái)操作文件系統(tǒng), 這相當(dāng)于我們編寫mapreduce來(lái)分析數(shù)據(jù).
后來(lái)有了數(shù)據(jù)庫(kù), 沒(méi)人再操作文件系統(tǒng)了(除非有其它需求), 而是直接使用sql再加一些數(shù)據(jù)的處理. 這就相當(dāng)于 hive + python了
hive + python能解決大多的需求, 除非你的數(shù)據(jù)是非結(jié)構(gòu)化數(shù)據(jù), 此時(shí)你就回到了遠(yuǎn)古時(shí)代不得不寫mapreduce了.
而為什么不使用hive+java, hive+c, hive+...
因?yàn)?
python真是太好用了, 腳本語(yǔ)言, 無(wú)需編譯, 有強(qiáng)大的機(jī)器學(xué)習(xí)庫(kù), 適合科學(xué)計(jì)算(這就是數(shù)據(jù)分析啊!!)
hive與python的分工: 使用hive sql作為python的數(shù)據(jù)源, python的輸出作為map的輸出, 再使用hive的聚合函數(shù)作為reduce.
下面使用一個(gè)例子來(lái)分析: 統(tǒng)計(jì)每個(gè)人在某日期人下吃的各種食品的數(shù)量
hive> create table user_foods (user_id string, food_type string, datetime string ) partitioned by(dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE # partitioned by(dt string) 以日期分區(qū) # 以\n分隔, 字段與字段間以\t分隔.
根據(jù)業(yè)務(wù)需要, 因?yàn)槭前刺靵?lái)統(tǒng)計(jì), 為減少分析時(shí)的數(shù)據(jù)量, 上述hive表以dt(日期)為分區(qū).
創(chuàng)建Hive表后, 會(huì)在HDFS /hive/目錄下創(chuàng)建一個(gè)與表名同名的文件夾
hive> ALTER TABLE user_foods ADD PARTITION(dt='2014-06-07');
創(chuàng)建分區(qū)后, hdfs目錄/hive/user_foods/下多了一個(gè)df='2014-06-07'的目錄
創(chuàng)建一個(gè)文件如data.txt, 加入測(cè)試數(shù)據(jù)
user_1 food1 2014-06-07 09:00 user_1 food1 2014-06-07 09:02 user_1 food2 2014-06-07 09:00 user_2 food2 2014-06-07 09:00 user_2 food23 2014-06-07 09:00
hive> LOAD DATA LOCAL INPATH '/Users/life/Desktop/data.txt' OVERWRITE INTO TABLE user_foods PARTITION(dt='2014-06-07');
導(dǎo)入成功后, 使用select * from user_foods查看下.
或使用
hive> select * from user_foods where user_id='user_1'
這會(huì)生成一個(gè)mapreduce
"統(tǒng)計(jì)每個(gè)人在某日期人下吃的各種食品的數(shù)量" 太過(guò)簡(jiǎn)單, 不需要python就可實(shí)現(xiàn):
hive> select user_id, food_type, count(*) from user_foods where dt='2014-06-07' group by user_id, food_type;
結(jié)果:
如果需要對(duì)數(shù)據(jù)清洗或更進(jìn)一步處理, 那么肯定需要自定義map, 這就可以使用python來(lái)實(shí)現(xiàn)了.
比如food2與food23認(rèn)為是同一類型食品, 此時(shí)利用python進(jìn)行數(shù)據(jù)清洗, python的腳本如下: (m.py)
#!/usr/bin/env python #encoding=utf-8 import sys if __name__=="__main__": # 解析每一行數(shù)據(jù) for line in sys.stdin: # 略過(guò)空行 if not line or not line.strip(): continue # 這里用try 避免特殊行解析錯(cuò)誤導(dǎo)致全部出錯(cuò) try: userId, foodType, dt = line.strip().split("\t") except: continue # 清洗數(shù)據(jù), 空數(shù)據(jù)略過(guò) if userId == '' or foodType == '': continue # 清洗數(shù)據(jù) if(foodType == "food23"): foodType = "food2" # 輸出, 以\t分隔, 即map的輸出 print userId + "\t" + foodType
再使用hql結(jié)合python腳本來(lái)分析, 有以下兩步.
1. 加入python腳本, 相當(dāng)于將腳本加入到 distributed cache
2. 執(zhí)行, 使用transform和using
hive> add file /Users/life/Desktop/m.py; hive> select user_id, food_type, count(*) from ( select transform (user_id, food_type, datetime) using 'python m.py' as (user_id, food_type) from user_foods where dt='2014-06-07' ) tmp group by user_id, food_type;
結(jié)果:
1. 首先保證腳本沒(méi)有語(yǔ)法錯(cuò)誤, 可以執(zhí)行python m.py來(lái)驗(yàn)證
2. 確保代碼沒(méi)有其它輸出
3. 可以使用測(cè)試數(shù)據(jù)來(lái)測(cè)試腳本, 比如:
$> cat data.txt | python m.py user_1 food1 user_1 food1 user_1 food2 user_2 food2 user_2 food2
1, 2, 3都正確后, 如果再使用hive+python有錯(cuò)誤, 可能的錯(cuò)誤有:
1. python腳本對(duì)數(shù)據(jù)的處理不健壯, 有些邊界條件沒(méi)有考慮, 導(dǎo)致python出現(xiàn)exception
2. 自己總結(jié)吧...
上面這個(gè)例子的python腳本充當(dāng)map的角色, 當(dāng)然也可以再建立一個(gè)reduce.py來(lái)統(tǒng)計(jì)map的輸出而不使用hive的聚合函數(shù).
這是建立在hive已不能滿足你的需求之上的.
上述內(nèi)容就是hive+python數(shù)據(jù)分析是怎么入門的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。