Pigで直接データを記述する裏技

どうも、豚さんと戯れるようになってから早いもので半年近く経ちました。
Pigを使い始めて最初に思ったこと。

「データって直接記述できないの?」

そんな疑問に半年ぐらいたった自分からお答えしましょう。実は裏技があるんです!

サンプル

次のようなデータを記述しようと思います。

1	hoge
2	fuga
3	piyo

まずは何を記述してもいいので1行だけのファイルを作成します

$ echo dummy >dummy

サンプルコードは次のようになります。
make_data.pig

A = LOAD 'dummy';

B = UNION
  (FOREACH A GENERATE 1 AS id, 'hoge' AS name),
  (FOREACH A GENERATE 2, 'fuga'),
  (FOREACH A GENERATE 3, 'piyo');

STORE B INTO 'sample';

実行

$ pig -x local make_data.pig
$ cat sample/*
2	fuga
3	piyo
1	hoge

ちゃんとデータが作成されていますね!
※1行に対して1mapタスクが実行されるのでレコードの順番はランダムです

ポイントとしては、UNIONでくっつける時に最初のデータのフィールドにだけ名前をつける(ASを使う)ということです。
UNIONは型さえ一緒であればフィールド名なんてお構いなしに最初のエイリアスのフィールド名を採用するんで、Pigのバグなんじゃないかと思いますが2つ目以降にもASを使うと意味不明なエラーになります。

Pigではデータを直接記述できないと何人かに言ってしまったことがありましたが知識不足でした!
この場を借りてお詫び申し上げます!!

広告
R用のコマンドラインオプションパーサ(PerlのGetopt::Longもどき)を作ってみた 公式RTと非公開ツイートの関係についてのメモ
※このエントリーははてなダイアリーから移行したものです。過去のコメントなどはそちらを参照してください