<hadoop Pig>pig使ってみた

今回はhadoop pigを使って情報の抽出を行ってみました。
文献が少ないので大したことをしていないのですが書き残しておこうかなと思います。

目次

  1. 今回すること
  2. hadoop pigとは
  3. どのような流れか
  4. 実際のコード . その他

1. 今回すること

今回は気象庁から提供される台風情報のCSVデータ(偶然見つけた)をもとにして、各台風について気圧が最低になったときの情報を抽出します。 元データの例

2. hadoop Pigとは

実際のコードを書く前にhadoop Pigがどのようなものかを簡単に書いておきます。
分散処理を行う際に用いられるhadoopというフレームワーク上で動くスクリプト言語がpigです。ベースはJavaらしいです。 Apacheが提供しているみたいです。 Apache Pig

3.どのような流れか

データ読み込み

元になるCSVファイルをすべて読み込みます。 今回はdata/input/以下に複数の対象データを保存しています。

読み込みデータをソート

読み込まれたデータは日時等の順番がばらばらになっているので年月日時でソート処理を行います。

ソートしたデータのグループ化

ソートしたデータを台風それぞれでグループ化します。各台風での情報の比較がしやすい状態にしていきます。

各台風が最低気圧だった時の情報を抽出

これが今回作成するプログラムの肝になっています。グループ化したそれぞれの台風について、気圧が一番低くなっている時の情報(勢力が一番強くなっている)を切り出すようにします。

古いデータの削除

あんまり気にすることもないとは思うんですが、Pigの仕様として古い出力データが残っているとエラー起こすっていう問題があります。1回しか実行しないなら特にいらないんですが、デバッグとかで回数実行するときは古いデータの削除を行う必要があります。

処理結果の出力

処理結果をファイル出力します。今回は更に加工しようかなと思っていたのでCSVに近い形式で出力します。各行についてカンマ区切りでデータを書き出しました。

4.実際のコード

実際のコードも上と同じ順番で軽く書いていきます。

データの読み込み

データを読み込むときにはLOADメゾッドを使います

-- データを読み込む typhoon_input = LOAD 'data/input/'USING PigStorage( ',' ) AS (year:int, month:int, day:int, time:int,num:int, name:chararray,level:int, lat:double, long:double,power:double );

USING PigStorage(',')を使うことで、データの区切り文字を指定できます。 AS以降には各データの形式を指定しています。ASは必須ではないのですが、あったほうが後々扱いやすくなるのではないかなと思います。
ホントは経度をlongと書きたかったのですが予約語になっているので諦めます。logにしました。

読み込みデータをソート

データのソートをするときにはORDER BYを用います。

--データを月、日、時でソート
order_data = ORDER typhoon_input BY year,month,day,time ;

ORDER 対象 BY キーで並べ替えができます。このときのキーは複数でも扱うことができます。 今回は複数キーを同時に扱っています。

ソートしたデータをグループ化

ソートしたデータを各台風単位でグループにします。

-- ソートしたデータを名称ごとグループ化 typhoon_data_all = Group order_data BY num;

GROUP 対象 BY キーでグループ化できます。

各台風が最低気圧だった時の情報を抽出

グループ化された各データの中でも気圧が最低の時の情報を抽出します。

-- 一番気圧が低下した時のデータ、各台風のデータ数を記録 hpower_data = FOREACH typhoon_data_all {sorted = ORDER order_data BY power; mdata = LIMIT sorted 1; GENERATE group , FLATTEN(mdata.power) AS power ,FLATTEN(mdata.lat) AS lat , FLATTEN(mdata.log) AS log , COUNT(order_data),FLATTEN(mdata.year) AS year,FLATTEN(mdata.month) AS month,FLATTEN(mdata.day) AS day,FLATTEN(mdata.time) AS time;};

FOREACHを使って対象の各グループについて実行しています。 各グループについて気圧を基準にして並べ替えをしました。 そのデータの先頭にあるデータが気圧が最低になった時のデータになっているのでそのデータをFLATTENというグループ化の解除をしながら呼び出します。 また、各台風のデータ数を確認するためにCOUNTを用いています。

古いデータの削除

Pig内でコマンドが使えるらしいです。 rmを用いることも可能なのですが、フォルダ系の削除に対応したrmfを用いることで出力の古いデータの確実な削除をしています。

-- outputデータを削除 rmf data/output;

データの出力

データをファイルに出力します。 そのときにはSTOREを用いることで出力が可能になります。

-- 取得したデータをoutput ;STORE hpower_data INTO 'data/output' USING PigStorage(',');

そうするとこんな感じで出力されます。

f:id:poolbooyer:20190125141828p:plain
出力結果のサンプル

その他

今回の参考文献はこちら

pig.apache.org

次のエントリでこの出力結果を加工するお(すでにしてるんだけどエントリに書く時間がなさげ)

<ruby>pdfをcsvにしてやんよ

してやんよ

目次

  1. 背景
  2. 今回やること
  3. 使った環境
  4. コードの説明
  5. その他

1.背景

とある授業で気象庁のデータを元にして、解析を行おうと思っていたのですが、、
pdf形式でオープンデータしてくれたので元のデータをcsvにかこうしなきゃいけないことになっちゃった、、、って感じです。
多分ググればそれに近いのあるんだろうけどそれもつまんないなぁって忙しいのに手を付けたくなってしまったのでやってました。

2.今回やること

入力データとしてpdfを入れる 入力データ中の日付、時間、位置情報(緯度経度)、中心気圧を取り出します。 これらのデータしか欠損等がないデータがないので上のデータでなんとかします。 取り出したデータを元にCSVファイルに吐き出します。

3.使った環境

安定してMac で作りました。 今回はVSCode上で制作を行いました。 rubyとpdfを読み込むgemとしてpdf-readerを使いました。 このgemを選択した理由としては他のgemも試したのですが、これ以外のgemは同じファイルでも読み込むときによって結果が変動したりしたからです。

4.コードの説明

今回はgithub上でソースを管理しました。

github.com

この中で特に引っかかったとこ書きます。

他でやることできちゃったので時間ができたら書きます。

5. その他

現時点で何個か読み込めないやつがあります それはそのうち直します。

結局enPiT2(BizsysD分野)って高専生に勧められるの?

はじめに

あけましておめでとうございます。
今年も書こうと思ったことを徒然なるままに書き続けようと思っております。
("徒然なるまま"にはgoogleIMEの予測候補に出てきたので使ってみました)
今回で多分enPiTネタは最後です。

イントロ

今回はenPiT2(BizsysD分野)が高専生に勧められるのかっていう話を書きます。
事務局からアンケートがあって、それがどこかしらで使われるらしいのですが、その回答と同じことを書きます。
回答に追記で少しコメントを書いておこうかなと思っています。
一応ターゲットとしては受講してみようかなと思ってる高専生という感じで書いていきます。
ただ、どういう体制で参加するかによっても参考になるかは違うのでこのエントリだけで判断することはないようにしてもらいたいと思います。 表現が統一できてないのは思ったことを垂れ流してる証拠だと思って許して下さい。

目次

  1. まずは表題の回答
  2. どんな質問をされたか
  3. それに対してどう答えたか
  4. 回答についての細かい補足
  5. その他

1.まずは表題の回答

先に答えだけ書いとくとめちゃめちゃオススメです。読んでくとどっちだ?ってなるかと思いますが、勧められると思います。その反面、、、っていう部分についても書いてあるのでそこも含めて考えて決めてもらいたいなぁと思います。

2.どんな質問されたか

質問は以下の3つでした。

  • 産技大enPiT2プログラムに参加して良かった点
  • 高専生の視点から見て)産技大enPiT2プログラムの今後の改善点
  • 高専の後輩に産技大enPiT2プログラムへの参加を今後薦めるか否か この先ではそれぞれどう答えたかも書いておきますが、基本的に最後の質問について重きをおいて書きます。

3.それに対してどう答えたか

3.1 産技大enPiT2プログラムに参加して良かった点

  • 高専以外の同世代とのコミュニケーションをたくさん取ることができる。
  • チーム開発の理論的な部分の学びが多く得られる。

3.2(高専生の視点から見て)産技大enPiT2プログラムの今後の改善点

  • 5年生での参加の問題もあるかと思うのですが、研究の発表等とのスケジュールの重なりがあるのが調整できると参加する際の不安が軽減されると思う。

3.3 高専の後輩に産技大enPiT2プログラムへの参加を今後薦めるか否か

  • 受講生としての視点では勧めたいが、高専で生活をしている中では積極的に勧めづらいと感じる。
    • enPiTを通して得られる経験等は高専生活をするだけでは絶対に得られないものなので参加してほしいが、高専での研究やそれ以外の学校生活のの両立という面ではなかなか厳しい部分がある。
    • 高専からの参加であれば、学年や学科混合でのチームを作って参加できるようになると本科5年生や、専攻科2年生での参加に不安が軽減されるのではないかと感じる。

このしたの記述は追加で回答した内容です。
研究との両立に厳しい部分があるの各高専、各所属学科のカリキュラムの組み立てによっても多少違いはあるかと思います。発表等のスケジュールは高専内にいないと把握ができないこともあるので、この先の話はS高専のHキャンパスだけについて記述します。 自分が所属するINは同じキャンパスにあるほかの2学科と比べると中間発表の回数が多くなっています。特に、秋口から年末にかけて2回あるというのはこの学科のみになっています。また、5年間全体を通しても課題等が多く課されるのはこの学科のように感じています。学年によっては多少ほかの学科のほうが厳しい時もあるのですが、5年間コンスタントに課題等が多く設定されているような学科です。 そういった部分を考えると、今所属する学科以外の後輩や、専攻科生にこのenPiT2の受講を勧めたいとも思います。

4.回答についての補足

上の3.3で回答した内容について簡単に補足を書きます。

  • 正直、卒業年度で受けるのはきついんじゃないかなと思いました。
    • 学校での研究や、それに関わる中間発表の準備との両立がなかなかきつかったです。
    • 上の補足回答でもありますが、中間発表等の回数によっても多少違いはあるかと思います。そこは自分の所属する学校、学科のカリキュラムとにらめっこして判断する必要があるかと思います。
    • ただ、履修とかに余裕を持っている"優秀な"高専生なら研究と1,2科目くらいでenPiT2の秋学期中の授業が終わる人もいると思うのでそこは過去の自分とも要相談だと思います。
  • 上の補足とも関係が少しありますが、enPiT自体についてももう少し早く知っておきたい
    • 自分はもともとweb系に興味があって自分で勉強していた部分もあったのでもともと持っていた知識と、実装したいものに追加で必要な知識の学習で解決できたが、すべて一から学ぶとなるときつかった気がする。
    • enPiT自体をもっと早め(個人的には3年後期くらい)とかから知っていれれば、単位数とかもっと余裕を持って調整しとけばとかもちょっと思った。
  • 内容的には高専生にこそ受けてほしい
    • 希望した人が参加するやつなので参加してるメンバーのモチベーションがかなり高いです。こういうの参加しようとする人はある程度いろんなことにやる気がある人だと思うのですが、周りがみんなやる気高いです。やりたくないけどやらされてるみたいな人がいないのは圧倒的にグループでの活動する中で精神衛生に非常によろしいです。(日本語に違和感)
    • どういう形式で参加するかによっても違いますが、大学生に囲まれていろいろすることになる可能性が高いと思います。同級生がほぼ変わらない高専生活の中で数少ない知らない同世代に囲まれるチャンスです。気分は転校生(n回目)でした。編入生でもない限り、ある程度人間関係できた中に飛び込むことはないと思うんでそういう経験もできて一石n鳥です。 とりあえずこれくらい、多分まだいろいろ思うことはあるけどまとまらないので時々追記すると思います。

5.その他

一応enPiT2受講時のスペックを書いとく

  • S高専HキャンパスIN所属
  • 5年
  • 通信系研究
    • pythonを用いた機器管理
  • 小売業のアルバイト
    • 週3~4
      • 平日4時間(18:00~22:00)
      • 土日8時間(15:00~22:00)(休憩あり)

これはあんまり書きたくなかったのですが、事実なので書いておくと、スケジュールが一番きつかった時期(12月の中間発表前くらいだったはず)に肌に蕁麻疹のようなものが出てきたときに通院したところ、皮膚に症状が出る風邪のようなものと言われたのですが、そのときに"過労気味"とも医師から言われました。enPiTが直接の原因とは思ってもいませんが、enPiT、学業とアルバイトすべての両立にはそれくらい体に負担がかかっているんだなぁと思いました。単位目当てでノリで受けれるような甘いものではないことは確かなので、受講するときはその覚悟はしておく必要はあるかなと思います。