27. 練習問題¶
この練習問題は、Asakusa Frameworkへの理解を確認すること、このチュートリアルで紹介していない機能について学ぶこと、 [Asakusa Framework documentation] の読み方に慣れることなどを意図しています。
練習問題の回答は用意していませんが、ここに挙げている問題に取り組むことでAsakusa Frameworkに対してより深い理解が得られると思いますので、是非チャレンジしてみてください。
各バッチアプリケーションを作成したら、テストドライバーで動作を確認したり、YAESSを使って実際にバッチアプリケーションを実行してみてください。
27.1. 練習問題 1¶
1つのCSVファイルを読み込み、そのままの内容をCSVファイルに出力するバッチアプリケーションを作成しなさい。
27.1.1. ヒント¶
- 演算子は不要です。
- データフローの入力は、以下のようにそのまま出力に接続することができます。
final In<Hoge> input;
final Out<Hoge> output;
...
@Override
protected void describe() {
output.add(input)
}
27.1.2. 応用問題¶
- 出力ファイルの並び順を指定しなさい。
- データの内容に応じて出力ファイル、またはディレクトリを分割しなさい。
27.2. 練習問題 2¶
CSVファイルを読み込み、レコードの内容によって出力ファイルを振り分けるバッチアプリケーションを作成しなさい。
例えば、ある項目が同じ値をもつレコードごとに振り分ける、数値の大小によって振り分ける、など。
27.2.1. ヒント¶
いくつかの実現方法が考えられますが、以下にその一例を紹介します。
- 分岐演算子を使って、データフロー内で振り分ける。
- 抽出演算子を使って、データフロー内で振り分ける。
- Direct I/O の「出力ファイル名のパターン」を使って、プロパティの内容からファイル名を生成して出力する
これらの機能はそれぞれ実現できることや用途が異なるので、その違いについても考えてみてください。
27.2.2. 応用問題¶
振り分けたの出力のうちの1つを出力から除外しなさい。また、除外したレコードの内容をログに出力しなさい。
27.3. 練習問題 3¶
あるデータモデルに対して、レコードがもつ複数のプロパティを使った集計を行うバッチアプリケーションを作成しなさい。 例えば 売上明細 ( sales_detail ) に対して「数量」×「販売単価」の合計を求めるようなアプリケーションです。
27.3.1. ヒント¶
いくつかの実現方法が考えられますが、以下にその一例を紹介します。
- 畳み込み演算子を利用する。
- グループ整列演算子を利用する。
また、演算子リファレンス上で上記の演算子における「性能特性」の違いについて、その意味を確認しなさい。
27.3.2. 応用問題¶
集計項目の値に不正な値(例えば「数量」が0など)が含まれているレコードに対しては集計から除外して、 該当レコードを集計結果とは異なるファイル(エラーレコードファイルなど)に出力しなさい。
27.4. 練習問題 4¶
あるデータに対して訂正情報を一括で反映するようなバッチアプリケーションを作成します。
対象データと訂正情報をキーで結合して、訂正情報が見つかった対象データは訂正情報がもつプロパティで対象データを更新して「処理済みファイル」に出力し、 訂正情報が見つからなかった対象データはそのまま「処理済みファイル」に出力しなさい(つまり入力となる対象データと出力となる処理済みファイルの件数は同じになります)。
27.4.1. ヒント¶
いくつかの実現方法が考えられますが、以下にその一例を紹介します。
- マスタつき更新演算子を利用する。
- グループ結合演算子を利用する。
また、演算子リファレンス上で上記の演算子における「性能特性」の違いについて、その意味を確認しなさい。
27.4.2. 応用問題¶
不正なキーをもつ訂正情報が含まれていることを想定して、対象データが見つからなかった訂正情報を「訂正エラーファイル」に出力しなさい。