-
Notifications
You must be signed in to change notification settings - Fork 3
Home
- 2017年4月: version 3.0 リリース (git hub対応)
Mコマンド(MCMDとも表記する)とは、大規模表構造データ(CSV)を高速に処理する目的で開発されたコマンド群である。 MコマンドのMは、発案者である松田康之氏のイニシャルに拠っている。 Mコマンドは、単一の機能(例えば、並べ替えや表の結合など)に特化したコマンドを約80種類提供している。 全てのコマンドは共通して、標準入力からCSVデータを読み込み、標準出力に結果を書き込むだけの非常にシンプルな処理方式に従っている。 そして単一の機能を持ったコマンドをパイプによって接続することで多様な処理を実現する。Mコマンドを使えば、標準的なPCであっても、数億件規模のデータ処理が可能である。 Mコマンドの基本的な利用方法の習得にはさほど時間は必要とせず、集中的に取り組めば数週間でかなり自由にデータ加工ができるようになる。
- 日本語リファレンス・マニュアル (対応 NYSOL バージョン: Ver. 3.0) 更新日:2017/09/27
- 英語リファレンス・マニュアル (対応 NYSOL バージョン: Ver. 3.0) 更新日:2017/10/13
MCMDは、Linux, MacOSX, Bash on Ubuntu on Windowsといった、 代表的なOSでの動作確認はとれている。 その他にも、UNIX系のOSであれば上記のツールさえあれば利用できるであろう。 以下に動作が確認できているOSおよびそのバージョン一覧を示す。
- MacOS 10.9.5(Marverics)以上
- CentOS 7.3 1611
- Ubuntu 16.04 LTS
- Bash on Ubuntu on Windows(Windows 10)
- c++コンパイラ
- autotools
- boost C++ library
- lib2xml Library
## autotoolsとboostを導入していなければbrew等でインストールする。
$ brew install autoconf
$ brew install automake
$ brew install libtool
$ brew install boost
## ソースのダウンロード
$ git clone https://github.com/nysol/mcmd.git
$ cd mcmd
## コンパイルとインストール
$ aclocal
$ autoreconf -i
$ automake --add-missing
$ export LIBRARY_PATH=/usr/local/lib # Sierraにupgradeした場合に必要との報告あり
$ ./configure
$ make
$ sudo make install
## autotools,boost,libxml2を導入していなければyum等でインストールする。
$ sudo yum update
$ sudo yum groupinstall "Development Tools"
$ sudo yum install boost-devel
$ sudo yum install libxml2-devel
## ソースのダウンロード
$ git clone https://github.com/nysol/mcmd.git
$ cd mcmd
## コンパイルとインストール
$ aclocal
$ autoreconf -i
$ ./configure
$ make
$ sudo make install
# 共有ライブラリのパス設定
# 起動時に毎回設定するのであれば.bash_profileに記載しておく(ログインし直すまでは反映されません)。
$ export LD_LIBRARY_PATH=/usr/local/lib
## autotools,boost,libxml2など必要なツールを導入していなければapt-get等でインストールする。
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential
$ sudo apt-get install git
$ sudo apt-get install libboost-all-dev
$ sudo apt-get install libxml2-dev
## ソースのダウンロード
$ git clone https://github.com/nysol/mcmd.git
$ cd mcmd/
## コンパイルとインストール
$ aclocal
$ autoreconf -i
$ ./configure
$ make
$ sudo make install
# 共有ライブラリのパス設定
# 起動時に毎回設定するのであれば.bash_profileに記載しておく(ログインし直すまでは反映されません)。
$ export LD_LIBRARY_PATH=/usr/local/lib
各コマンドの利用方法については --help オプションを指定することで簡単なヘルプが表示される。 以下のようにコマンドヘルプが表示されたらインストールは完了している。 Ver.2.4からは --help オプションのデフォルトが英語に変更になった為、日本語で出力したい場合は、 --helpl オプショ ンを指定すると今まで通りに日本語の簡単なヘルプが出力される。 また、環境変数に KG_LOCALHELP=true を設定しておくと、 --help で日本語を出力をデフォルトにすることができる。
$ mcut --help
MCUT - SELECT COLUMN
Extract the specified column(s). The specified column is removed with -r
option.
Format
mcut f= [-r] [-nfni] [i=] [o=] [-assert_diffSize] [-assert_nullin]
[-nfn] [-nfno] [-x] [-q] [tmpPath=] [--help] [--helpl] [--version]
:
:
$ mcut --helpl
mcut 項目の選択
===============
指定した項目を選択する。
-rオプションを付けると、指定した項目を削除する。
書式
----
mcut f= [-r] [i=] [o=] [-nfn] [-nfno] [-x] [--help] [--helpl] [--version]
パラメータ
----------
f= 抜き出す項目名
項目名をコロンで区切ることで、出力項目名を変更することができる。
ex. f=a:A,b:B
-r 項目削除スイッチ
f=で指定した項目を削除し、それ以外の項目が抜き出される。
-nfni 入力データの1行目を項目名行とみなさない。よって項目番号で指定しなければならない。
以下のように、新項目名を組み合わせて指定することで項目名行を追加出力することが可能となる。
例)f=0:日付,2:店,3:数量
:
:
また --version にてMCMDのバージョンが表示される。 このバージョンはコマンド毎のバージョンではなく、MCMD全体のバージョンであることに注意する。 したがって、全てのコマンドで同じバージョンが表示される。
$ mcut --version
lib Version 1:1:0:0
AnacondaをインストールしたOSでは一部、インストールが出来ない問題が確認されており、 コマンド検索PATHの順序を変更することでエラーを回避できることが確認されている。 変更を行った後、各OSで記載されている手順に従ってインストールする。
簡単な例から始めよう。まずはCSVデータがなければ始まらない。MCMDでは、多くの種類のデータセットを出力するためのmdataコマンドを備えている。以下にその利用例を示す。$で始まる行はコマンドラインでの入力を表し、その下に実行結果が示されている。 mdataコマンドは、データセットの種類を引数にとり、標準出力に内容を出力する。 以下の例では、標準出力の内容をリダイレクトしてman0.csvという名前のファイルに出力している。
$ mdata man0 >man0.csv
#END# mdata man0
$ more man0.csv
顧客,金額
A,5200
B,4000
B,3500
A,2000
B,800
MCMDの全てのコマンドは、終了すれば#END#から始まるメッセージを出力する(エラー終了すると#ERROR#から始まるメッセージが出力される)。 また、moreはファイルの内容をページ送りで表示するコマンドであり、データの内容を示すために利用している。
man0.csvデータを利用して、金額を顧客別に合計する例を以下に示す。 msumコマンドでは、man0.csvデータを読み込み(i=)、顧客項目を集計キーにして(k=)、金額項目を合計し(f=)、 結果を出力ファイルoutput.csvに書き込んでいる(o=)。 出力されたCSVの項目名「顧客」に"%0"が付いているが、これはmsumが顧客項目で並べ替えたことを示すものであり項目名の一部ではなく、今のところは特に気にする必要はない。
$ msum k=顧客 f=金額 i=man0.csv o=output.csv
#END# kgsum f=金額 i=man0.csv k=顧客 o=output1.csv; IN=5 OUT=2; 2017/04/16 21:35:08
$ more output1.csv
顧客%0,金額
A,7200
B,8300
もう少し複雑な例を示しておこう。 以下の例では、顧客別にどのような商品を何個購入したか、マトリックス形式で集計する。 #で始まる行はコメントであり入力する必要はない。 mcutコマンドは指定した項目を切り出すだけの機能を持つコマンドで、 mcountコマンドは行数をカウントするコマンドである。 そして、mcrossコマンドはクロス集計を行う。 ここでは、各コマンドの詳細な動きよりも、入力データが各コマンドによってどのように加工されていくかその流れを確認されたい。 以上のように、Mコマンドでは80種類以上のコマンドを組み合わせる事で多様なデータ加工を実現するのである。
$ mdata man1 >man1.csv
#END# mdata man1
$ more man1.csv
顧客,日付,商品
A,20130916,a
A,20130916,c
A,20130917,a
A,20130917,e
B,20130916,d
B,20130917,a
B,20130917,d
B,20130917,f
$ mcut f=顧客,商品 i=man1.csv o=xxa
#END# kgcut f=顧客,商品 i=man1.csv o=xxa; IN=8 OUT=8; 2017/04/16 21:36:11
$ more xxa
顧客,商品
A,a
A,c
A,a
A,e
B,d
B,a
B,d
B,f
# 顧客商品別に行数をカウントする。
$ mcount k=顧客,商品 a=件数 i=xxa o=xxb
#END# kgcount a=件数 i=xxa k=顧客,商品 o=xxb; IN=8 OUT=6; 2017/04/16 21:36:34
$ more xxb
顧客%0,商品%1,件数
A,a,2
A,c,1
A,e,1
B,a,1
B,d,2
B,f,1
# 商品を項目にしたクロス集計を実行。購入されていない商品の個数は0にしている。
$ mcross k=顧客 s=商品 f=件数 v=0 i=xxb o=xxc
#END# kgcross f=件数 i=xxb k=顧客 o=xxc s=商品 v=0; IN=6 OUT=2; 2017/04/16 21:37:04
$ more xxc
顧客%0,fld,a,c,d,e,f
A,件数,2,1,0,1,0
B,件数,1,0,2,0,1
# 余分な項目"fld"を除いている。
$ mcut f=fld -r i=xxc o=output.csv
#END# kgcut -r f=fld i=xxc o=output.csv; IN=2 OUT=2; 2017/04/16 21:37:55
$ more output.csv
顧客%0,a,c,d,e,f
A,2,1,0,1,0
B,1,0,2,0,1
以上の例では、各コマンドの結果をワークファイルファイル(xxa,xxb,xxc)に出力したが、パイプで連結することで、以下のようにワークファイルを使うことなく実行することも可能である。 パイプにより、あるコマンドの出力結果は次のコマンドの入力へと次々に受け渡されていく。
$ mdata man1 | mcut f=顧客,商品 | mcount k=顧客,商品 a=件数 | mcross k=顧客 s=商品 f=件数 v=0 | mcut f=fld -r o=output.csv
#END# mdata man1
#END# kgcut f=顧客,商品; IN=8 OUT=8; 2017/04/16 21:32:28
#END# kgcount a=件数 k=顧客,商品; IN=8 OUT=6; 2017/04/16 21:32:28
#END# kgcross f=件数 k=顧客 s=商品 v=0; IN=6 OUT=2; 2017/04/16 21:32:28
#END# kgcut -r f=fld o=output.csv; IN=2 OUT=2; 2017/04/16 21:32:28
$ more output.csv
顧客%0,a,c,d,e,f
A,2,1,0,1,0
B,1,0,2,0,1
なお、各コマンドの利用方法については--helpオプション(日本語は--helpl)を指定することで、以下に示すように簡単なヘルプが表示される。 また\verb|--version|にてMCMDのバージョンが表示される。 このバージョンはコマンド毎のバージョンではなく、MCMD全体のバージョンであることに注意する。 したがって、全てのコマンドで同じバージョンが表示される。
$ mcut --helpl
MCUT 項目の選択
指定した項目を選択する。
-rオプションを付けると、指定した項目を削除する。
書式
mcut f= [-r] [-nfni] [i=] [o=] [-assert_diffSize] [-assert_nullin]
[-nfn] [-nfno] [-x] [-q] [tmpPath=] [--help] [--helpl] [--version]
パラメータ
f= 抜き出す項目名
項目名をコロンで区切ることで、出力項目名を変更することができる。
ex. f=a:A,b:B
-r 項目削除スイッチ
f=で指定した項目を削除し、それ以外の項目が抜き出される。
-nfni 入力データの1行目を項目名行とみなさない。よって項目番号で指定しなければならない。
以下のように、新項目名を組み合わせて指定することで項目名行を追加出力することが可能となる。
例)f=0:日付,2:店,3:数量
:
- 中原孝信,中元政一,羽室行信, ビッグデータ解析ツールNYSOL ―性能評価,並列処理,ビジネス応用ケース―, オペレーションズ・リサーチ, vol.61, No1, pp.11-18.
- Stephane Cheung, Masakazu Nakamoto, and Yukinobu Hamuro, "NYSOL: A User-Centric Framework for Knowledge Discovery in Big Data," International Journal of Knowledge Engineering vol. 1, no. 3, pp. 214-218, 2015.
MCMDの開発の一部には以下に示す研究助成を受けている。
- JST CREST グラントナンバーJPMJCR1401
- 統計数理研究所平成27年度公募型共同利用一般研究 1・27-共研-1031
- JST ERATO 湊離散構造処理系プロジェクト