読者です 読者をやめる 読者になる 読者になる

KZKY memo

自分用メモ.

mコマンドを触ってみた

mコマンド(mcmd)というものが耳に入ったのでひと通り触ってみた.
数億件くらいのCSVデータを効率的に集計処理できる

mコマンドとは

  • join, uniq, sort, count, sum, aveなどの集計処理に使える
  • in/outのフォーマットはCSV
  • パイプが使えるので,他のunixコマンドと組み合わせられる
  • 1台の標準PCでも数億件行のデータを効率よく処理できる

NYSOL

大規模データの解析に関する様々な大学やプロジェクトでの研究成果を

広く産業界に還元する目的で構築されたソフトウェアツールの総称およびそのプロジェクト活動である。

の元で配布しているらしいので,日本人くらいしか使っていないかもしれないことに注意.

インストール (Ubuntu14.04)

依存関連で足りなかったもの(他にもg++とかあるが)

実際のインストールは,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使えば良い.

個人的には,引き出しの一つとしてとっておく.