Data Trip - 台灣 PM 2.5 最高與最低地區

距離上次發佈資料研究文章好一陣子,主要在把過去走馬看花的 Hadoop 再複習,並學習了一些相關生態圈的內容,Hadoop 生態圈己經發展了相當完整,列舉其中幾個項目,希望今年能夠熟悉他們並能應用在實際的資料上:

  • 基礎: Hadoop, HBase, ZooKeeper
  • 資料處理相關: Hive, Pig, Chukwa
  • 綜合及與ML相關: Mahout, Spark
  • DevOps: Ansible, Puppet,其實不一定要使用工具,Shell Script 也可以達成

回到這次的應用,PM2.5這個指標近幾年在台灣的新聞開始被重視起來,且環保署也作了一個相當不錯的即時監測的網頁-行政院環境保護署-空氣品質監測網,但作資料分析就是喜歡追根究底一下其中的細節及統計,就來看看全年中較顯著的地方。

** PM2.5全年統計 **

我的目標是希望能在每天的0-23小時,針對個別被測量的最高的值站別累積計數一次,會得到:
日期,站別,小時,最大計數(或最小計數)
這樣的日計數統計,並且能按小時來統計 PM 2.5 最高值與最低值的各站別。因為各小時的全年統計量在這表達上有些困難,故在這只列出全年24小時最高前 10 名與最低量計數的前 20 名。

  • 全年量測最高計數 Top 10
觀測站 每小時最高量計數加總
埔里 704.0
馬祖 596.0
金門 507.0
林園 484.0
竹山 457.0
崙背 395.0
潮州 388.0
復興 316.0
斗六 301.0
小港 295.0

住在這些觀測站附近的人可能要隨時準備好保護措施。在這前 3 名蠻令人意外,好山好水的埔里竟然是第一名的壞空氣,我們還常去那裡渡假!另外 Top 2,3 的金門馬祖,依據新聞的說詞是來自東北的沙塵及工業污染,以及廈門污染物。

  • 全年量測最低計數 Top 20
觀測站 每小時最低量計數加總
前鎮 1314.0
恆春 1311.0
花蓮 1210.0
陽明 1176.0
菜寮 884.0
湖口 860.0
楠梓 768.0
臺東 751.0
三重 748.0
淡水 628.0
沙鹿 564.0
竹東 553.0
古亭 550.0
宜蘭 550.0
麥寮 524.0
橋頭 464.0
林園 403.0
仁武 380.0
關山 370.0
豐原 368.0

這個 Top 1 的資料有待再確認,因為我印象中前鎮是工業區,Google 了相關資料,似乎沒那麼樂觀,可能要回頭看看觀測站的資料。
更新:前鎮觀測站的資料有蠻多時段為0,這真的有待澄清是己改善或人為疏忽。或是以其他統計量來估計。

** 資料來源及內容 **

  • 資料來源: 行政院環境保護署-歷年監測資料下載, 可惜的目前(2017/01)僅提供 2015 年度資料
  • 資料格式:試算表檔案(.xls或.ods),這裡就比較頭疼,所以我希望能快速處理 79 個檔案,借助了 xls2csv 轉換 csv 以利後續載入 Hive,這裡有個坑,如果在 Hive 的 Schema 裡沒特別指定字串的界限符,最好先把雙引號處理掉,否則在 Hive 查詢時會誤認自己的 HQL 寫錯
  • 資料的格式為: 日期,觀測站, 觀測項, 00,01,02, 03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,其中我們只取觀測項為 PM2.5 的資料,其實有為數可觀的測量項目,日後都可以拿來探索一番

** 資訊技術 **

這次使用的資訊技術較為多一些,大致整理3個方面:

  1. Hadoop: 1 name node + 2 data nodes
  2. Hive: 使用 mysql 為 Metastore
  3. Python: pyhive 連接 Hive, Pandas 統計資料
    處理流為 Python <-> PyHive <-> Hive <-> Haddop

** 資訊處理 **

  1. 建立 Hive Table
create table TWOO (rdate date, station string, mitem string, r0 float,r1 float,r2 float,r3 float,r4 float,r5 float,r6 float,r7 float,r8 float,r9 float,r10 float,r11 float,r12 float,r13 float,r14 float,r15 float,r16 float,r17 float,r18 float,r19 float,r20 float,r21 float,r22 float,r23 float)
row format delimited fields terminated by ',' 
lines terminated by '\n'
tblproperties("skip.header.line.count"="1");

其中 skip.header.line.count 是為了忽略 csv 檔內的第一行標題欄。

  1. 測試 HQL,HQL 跟 SQL 還是有一些差異,而且都必須轉換為 Hadoop 的 Map-Reduce 程式,並等待各節點的計算,所以為了減少程式的測試時間,先完成 HQL。這裡有個難題,因為是按日期及按小時去取得最大值,如果按天x按小時這樣的個別擊破方式得到最高或最低觀測站,會是相當可觀的處理量(24 x 365=8760),2個data node的處理量,或採並行處理的方式,都是相當粍時的,且不符合 ** Hadoop 大規模讀取的特性**。還好 Hive 2 以後的版本有支援 aggregation 的處理:
rank() over (PARTITION BY rdate ORDER BY r0 DESC)
  1. Python 上場了,記得先把 Hive Server 開啟。這裡我原本調用Pyhs2,碰到了不少問題,也有人說Pyhs2己經不再維護,後來改採用PyHive來作連接,然後再一一把r0~r23 組合成 HQL 交由 Hive 處理。這裡取得最高值的一個循環(r0-r23),使用系統的量測時間為:
real    26m53.756s
user    0m0.999s
sys     0m0.043s

其實這時間處理有些長,應該試看看把 13,086,511 資料弄到 MySQL 來比較處理的時間。最後轉換為 Pandas 的 Data Frame 就由強大的Pandas,一行即得統計結果:

dd.loc[dd['MaxHourCount']>0, \
['Station','MaxHourCount']].groupby(['Station']).sum().sort('MaxHourCount',ascending=False).head(20)

最後來看看 Hive 轉換為 Hadoop Map/Reduce 的成果, _________

Hadoop Applications

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容

  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,135评论 3 49
  • 程序員創業白皮書 作者:Paul Graham Paul Graham是程序員,專欄作家。他在1995年創建了第一...
    刘立山John阅读 1,837评论 0 20
  • 昨天又喝吐了,完事这会儿才酒醒,期间梦到幼时的玩伴,我这玩伴十多岁时就因为矿难去了…… 这是多年前的事了,上面提到...
    落溪幽月阅读 340评论 2 1
  • 三天走路约10W步,平均每天3W步。去了11个景点,仅因三天的初识谈谈我对山城印象 为啥要说步数?三天10W步对于...
    奶茶Rella_教练阅读 550评论 2 8
  • Ansible Role: nodejs 安装nodejs 要求 此角色仅在RHEL及其衍生产品上运行。 测试环境...
    lework阅读 547评论 0 0