mコマンドを触ってみた
mコマンド(mcmd)というものが耳に入ったのでひと通り触ってみた.
数億件くらいのCSVデータを効率的に集計処理できる
mコマンドとは
- join, uniq, sort, count, sum, aveなどの集計処理に使える
- in/outのフォーマットはCSV
- パイプが使えるので,他のunixコマンドと組み合わせられる
- 1台の標準PCでも数億件行のデータを効率よく処理できる
NYSOL
大規模データの解析に関する様々な大学やプロジェクトでの研究成果を
広く産業界に還元する目的で構築されたソフトウェアツールの総称およびそのプロジェクト活動である。
の元で配布しているらしいので,日本人くらいしか使っていないかもしれないことに注意.
インストール (Ubuntu14.04)
依存関連で足りなかったもの(他にもg++とかあるが)
- ruby-dev
- libboost
実際のインストールは,Donwloadから最新版を持ってきて,
$ ./configure
$ make
$ sudo make install
laptopで,1.0hrくらいかかった.この記事を書いている時点での最新版は,2.4.
shared libraryを認識させる
$ sudo ldconfig
注意点
CSVは
- 全行同じフィールド数
- 1行の最大バイト数はデフォルト,1MB (10MBまで拡張可能)
- 最終レコードでも改行は必要
- カンマを含むデータはダブルクオーツで囲む
- ダブルクオーツを含むデータは,ダブルクオーツで囲む,かつデータ中のダブルクオーツにダブルクオーツをつける
- 改行を含むデータもダブルクオーツで囲む
mchkcsvコマンドでチェック可能.
データ型
まとめるより,これを見る.インプットの全てのデータは文字列で表現されていることに注意.
項目指定
いろいろある.直感にあっているので,まとめるよりこれを見る.
パラメータ指定
まとめるより,これを見る.結構直感的.
- i: input file
- o: output file
- f: field for in:out
- s: sort key
- k: key of "group by"
コマンド例
- mcmdは,mxxxというコマンド郡の総称.mxxxがいっぱいある.
- サンプルデータは,DLしたtar.gzの中のdatasetディレクトリに入っている
ここで紹介されているコマンドを練習として扱う.
sort
$ msortf i=uci/iris.csv f=SepalLength
cut
$ mcut i=uci/iris.csv f=SepalLength,SepalWidth,Species
cut, uniq, then cal length
$ mcut i=uci/iris.csv f=Species | muniq k=Species | mcal c='length($s{Species})' a=Species_len o=uci/Species_len.csv
join
$ mjoin i=uci/iris.csv m=uci/Species_len.csv k=Species f=Species_len
cut, then count
$ mcut i=uci/iris.csv f=Species | mcount k=Species a=count_Species
select with condition
$ msel i=uci/iris.csv c='$s{Species}=="setosa" || $s{Species}=="versicolor"' $ msel i=uci/iris.csv c='$s{Species}=="setosa" && ${SepalLength}>5'
所感
実験結果をCSV形式で吐いて,それを解析するときに,grep, cut, sort, uniq, awk, sedとかのコマンドの組み合わせで処理するよりは便利かもしれない.ただし,全行同じフィールド数って言うのが結構辛い制約なので,正直,書捨て集計をする場合は,grep, cut, sort, uniq, awk, sedに慣れていたら,必要ないと思ってしまった.
「そんなことはない!こういうユースケースでは超使える」という意見がある人は,教えてくださいm(_ _ )m.
中規模データでロジックが必要な場合はnumpy, scipy, pandas使えばいいし,大規模データでロジックが必要な場合はSpark使えば良い.
個人的には,引き出しの一つとしてとっておく.
参考
- http://www.nysol.jp/
- http://www.nysol.sakura.ne.jp/mcmd2/jp/index.html
- http://www.nysol.jp/install
- http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-datatype.html
- http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-csv.html
- http://www.nysol.sakura.ne.jp/mcmd2/jp/sect-fieldname.html
- http://nakapara.jp/practice/about_mcmd
- http://www.slideshare.net/weda654/m-40991284