「“Asakusaフレームワークで作ったアプリケーションが出力するシーケンスファイル”をHiveやPigから読む為のSerDe・Storage」を生成するデータモデルドライバーを作ったよ。
…えーと、順を追って説明していくと。
AsakusaFWで作ったアプリケーションは、実行するとシーケンスファイルを出力する。
これは普通のHadoopのシーケンスファイルであり、キーはNullWritableでデータ部はAsakusaFWのDMDLから生成したモデル(Writable)クラスとなっている。
そして、HiveやPigでは独自のSerDeやStorageを作れば個別のWritableを格納したシーケンスファイルを読むことが出来る。
なので、AsakusaFW用のStorageを手で作ってPigからファイルを読めるか試してみたら、出来た。
同様にAsakusaFW用のSerDeを作ってHiveからテーブルとして参照することも出来た。
ここまで来たら、次にDMDLからSerDe・Storageクラスを自動生成したい。
AsakusaFWではSPIの機能を使ってプラグインとして拡張できるという話を以前聞いていたから、SPIのファイルを探してみた。そしたらそれっぽいクラス(データモデルドライバー)を見つけたので試してみた。
で、SPIの機能を使って自分のクラスを呼ばせるのは、驚くほどすんなり出来た(笑)
で、既存のクラスを参考に実際のSerDeやStorageを生成するドライバーを書いてみたのだが、これがえらく大変。とっても大変。何度も強調したくなるくらい大変(爆)
最初はPigのStorage用のドライバーを試行錯誤しながら作ったので、1日(たぶん16時間)くらい。
次にHiveのSerDe用のドライバーを書いてみたが、ある程度慣れたとは思うんだけど、Pigよりステップ数が多いので(というかちょっと複雑なので)、同じく1日(16時間)くらいかかったと思う。(Eclipseが遅いせいでもあるのだが)
少なくとも丸2日間は完全にこれにかかりきりだったねorz
最終的にはちゃんと出来上がったけど、保守(修正)できる気がしない(苦笑)
このJavaソース生成用のクラス群だが、実によく出来ている。ここまでJavaの構文を網羅したクラス群を用意するのも大変だろう。自分で作れと言われたら絶対嫌だし(笑)、ここまで網羅できない。
でもこれは手でコーディングするときに使うものじゃないなー。
昔SQL文を同じような感じで構築していくフレームワークを使ったことがあるが、あれですら大変だった。
WHERE句を表すオブジェクトにANDやORのオブジェクトを登録し、そこに条件・演算オブジェクトを生成して追加していく…という感じ。
で、SQLですらちょっと複雑なものになると手で構文解析して記述していくのは大変なのに、Javaの構文全部なんて、とてもやってられないっす(苦笑) ちょっとした一文を書きたいだけなのに、やたら長くなって…。
(実はJavaソースを読み込んでこれらのクラスを使った形式で出力するツールがあったりするのかな?)
簡単にプラグインが追加できて、DMDLの情報を元に独自のクラスを生成できるのはとても便利だと思う。
でも、DMDL情報を保持するオブジェクトやファイルをオープンする機能を提供する程度に留めて、本文の出力はWriterやPrintStreamを使った単なる文字列出力でいいんじゃないかなぁ。
ちょうどHttpServletそのものを使ってHTMLを出力するような感じ。
もっと言えばJSPに相当するものがあると便利かもしれないけど、さすがにそこまで需要があるかどうかは不明だし^^;(ScalaやGroovyなら文字列内に変数を埋め込んだりして便利に構築できそうな気はする)