溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

hive+python數(shù)據(jù)分析是怎么入門的

發(fā)布時(shí)間:2021-12-02 17:31:51 來(lái)源:億速云 閱讀:223 作者:柒染 欄目:云計(jì)算

本篇文章為大家展示了hive+python數(shù)據(jù)分析是怎么入門的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

為什么要使用hive+python來(lái)分析數(shù)據(jù)

舉個(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來(lái)分析數(shù)據(jù)

hive與python的分工: 使用hive sql作為python的數(shù)據(jù)源, python的輸出作為map的輸出, 再使用hive的聚合函數(shù)作為reduce.

下面使用一個(gè)例子來(lái)分析: 統(tǒng)計(jì)每個(gè)人在某日期人下吃的各種食品的數(shù)量

建表 user_foods 用戶食品表

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+python數(shù)據(jù)分析是怎么入門的

導(dǎo)入數(shù)據(jù)

建立分區(qū)

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)建測(cè)試數(shù)據(jù)

創(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

導(dǎo)入數(shù)據(jù)

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

僅使用hive來(lái)分析

"統(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é)果:

hive+python數(shù)據(jù)分析是怎么入門的

結(jié)合使用python

如果需要對(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é)果:

hive+python數(shù)據(jù)分析是怎么入門的

python腳本調(diào)試建議

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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI