S-JIS[2011-08-13/2012-01-21] 変更履歴

Pig Latin

Pig Latin(Pigの独自言語。Latinは「ラテン」と読むらしい)のメモ。


Pigの構文

Pigの命令は基本的にセミコロン「;」を末尾に付けて実行する。
ただし命令の終わりとして解釈できる場合はセミコロン無しでも実行される。

命令は大文字でも小文字でも認識される。
ただし関数は大文字小文字が区別される。

コメントは「/* 〜 */」か、「-- 〜」。[2011-12-24]


Pigの操作

命令 説明
help ヘルプを表示する。 help
quit Pigを終了する。 quit
sh シェルを実行する。 sh ls
exec
run
Pigスクリプトを実行する。
execは定義されているエイリアスを含めるが
runは含めない。[2011-09-22]
 
kill ジョブを終了させる。  
set パラメーターを設定する。  
register 使用するjarファイルを読み込む。
ユーザー定義関数(UDF)を使えるようにする。
register /cygwin/tmp/myudf.jar
register file:/C:/cygwin/tmp/myudf.jar
define 関数名を定義する。 define myfunc myudf.SampleUDF();

Pig Latinの演算

Pig Latinではデータ(処理内容)を記述し、(基本的に)変数に代入しておくような書き方をする。
この変数は「alias(別名)」 あるいは「relation」と呼ばれる。(『Hadoop徹底入門』では「リレーション」と呼んでいるがヘルプではaliasと書かれている)

変数 = データ定義や処理内容;

データ処理の記述は、以前の処理結果である変数名(エイリアス)を指定し、そのデータを入力として新しいデータを生成するイメージ。
実際のデータ処理の実行は、実行する為の命令 (dumpstore)を記述したときに行われる。

各データにはフィールド(カラム)が複数存在することになる。
loadforeach等でフィールド名(項目名)を付けることが出来る。(項目名はdescribeで確認できる)
項目名を付けた場合も付けない場合も、$0,$1,$2,…という名前でフィールドを指定できる。

命令 類似 説明
load SQLのCREATE TABLE 読み込むファイルを指定する。
項目定義も同時に行うことが出来る。
PigStrorage()で区切り文字を指定できる。
デフォルトの区切り文字はタブ「'\t'」。
a1 = load '/cygwin/tmp/hello.txt';
a2 = load '/cygwin/tmp/hello.txt' as (text:chararray);
a3 = load '/cygwin/tmp/hello.txt' using PigStorage(' ') as (t1:chararray, t2:chararray, t3:chararray);
aliases   現在定義されているエイリアスの一覧を表示する。 aliases
describe   エイリアスの(出力結果の)項目定義を表示する。 describe a3
explain   エイリアスの実行計画を表示する。 explain a3
dump   エイリアスを実行し、結果を表示(コンソールに出力)する。 dump a3
store   エイリアスを実行し、結果をファイルに出力する。
指定するパスはディレクトリーであり、MapReduceの実行結果がその中に入る。
ディレクトリーが既に存在していたらエラーになる。(→rmで消せる)
PigStorage()で区切り文字を指定できる。
store a3 into '/cygwin/tmp/a3/output';
store a3 into '/cygwin/tmp/a3/output' using PigStorage(',');
foreach Scalaのmap
SQLのSELECT
データの変換(項目の絞り込みや関数の呼び出し)を行う。
関数は大文字小文字が区別される。
e3 = foreach a3 generate t1,t2;
e2 = foreach a2 generate UPPER(text) as uptext;
e1 = foreach a1 generate $0 as text1:chararray;
ScalaのflatMap falttenで1項目内の複数データを複数行データに変換できる。 ff = foreach a2 generate flatten(TOKENIZE(text)) as word;
filter Scalaのfilter
SQLのWHERE
データの抽出(条件による抽出)を行う。 f = filter a3 by t2 == 'World';
split   条件ごとに別のエイリアスへ出力する。
条件によっては同じデータが複数のエイリアスへ出力される。
これはエイリアスに代入する書式ではないのでちょっと特殊。
split a3 into
s1 if t2 == 'Hadoop',
s2 if t2 == 'Pig',
s3 if t2 == 'Hive';
group ScalaのgroupBy
SQLのGROUP BY
データをキー毎に集約する。
キー項目の名前は「group」、集約された各データは入力のエイリアス名となる。
describeで見てみると分かる)
g1 = group a3 by t1;
g2 = group a3 by (t1,t2);
cogroup   複数のエイリアスに対してキー毎に集約する。 cg = cogroup a3 by t1, zzz by z1;
join SQLのJOIN 複数のエイリアスを結合する。
left・right・fullが指定可能。何もつけなければinner join。
j1 = join d1 by id1, m1 by id1;
j2 = join d1 by id1 left, m1 by id1;
cross   クロスジョイン。 c1 = cross a1, a2;
union SQLのUNION ALL
Scalaの++
(同一項目数の)複数エイリアスを1つにまとめる。 u1 = union a1,a2;
distinct Scalaのdistinct
SQLのDISTINCT
重複データを排除する。 dis = distinct a1;
order SQLのORDER BY データをソートする。 o1 = order a3 by t1 asc, t2 desc;
limit SQLのLIMIT
Scalaのtake
出力件数を制限する。 lim1 = limit a1 10;
sample   サンプリング(ランダムな抽出)を行う。  
mapreduce   HadoopのMapReduceを実行する。  
stream   スクリプトを実行する。  

HDFS操作

HDFSをUNIXのようなコマンド(lsやcd・pwd・cat・cp等)で操作できる。
hadoopシェル(HDFS)のfs系コマンドでは基本的にフルパスで指定するが、Pigではカレントディレクトリーの概念を使える。

命令 説明
ls カレントディレクトリーのファイル一覧を表示する。 ls
pwd カレントディレクトリー名を表示する。 pwd
cd カレントディレクトリーを移動する。 cd /cygwin/tmp
cd ..
cat ファイルの内容を表示する。 cat hello.txt
cp ファイルコピー  
mv ファイル移動(改名)  
copyFromLocal ローカル→HDFSへのファイルコピー  
copyToLocal HDFS→ローカルへのファイルコピー
ファイルもディレクトリーもコピーできるが、ワイルドカードは使えない。[2011-09-22]
 
mkdir ディレクトリー作成  
rm
rmf
ファイル・ディレクトリー削除
ディレクトリーが空でなくても消せる。
rmは対象が存在しないとエラーになる。[2011-09-28]
rmfは存在しなくてもエラーにならない。
rm /cygwin/tmp/a3/output
fs Hadoopのfs系コマンドを実行する。 fs -ls

Pig目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま