Direct I/O line¶
Direct I/Oで任意のテキストファイルを行ごとに読み書きするための機能として、「Direct I/O line」を利用することができます。
Direct I/O lineはファイル内の行文字列とデータモデル内の1つの文字列型プロパティをマッピングする機能のみを提供します。 行文字列の解析、生成などの処理はバッチアプリケーションの演算子として記述します。
Direct I/O lineは、以下のような用途に利用することを想定しています。
- Direct I/Oが対応していないファイルフォーマットの入出力
- 入力ファイルの整形や形式変換、バリデーションチェックなどの事前処理
- 例えば CSVファイル の一部にDirect I/Oでは直接扱えないような形式が含まれる場合に、事前に形式の変換を行うといった用途で利用します。
データモデルクラスの生成¶
Direct I/O lineを利用するには、DMDLに対してDirect I/O lineを利用することを示す拡張属性 @directio.line
を追加します。
シンプルな例¶
以下はDirect I/O lineと連携するデータモデル定義の最もシンプルな例です。
@directio.line
model = {
line : TEXT;
};
データモデルに拡張属性 @directio.line
を指定して、 TEXT
型のプロパティを1つだけ定義すると、
このプロパティが行文字列の入出力対象として使用されます。
ファイル形式の設定¶
@directio.line
属性には、次のような要素を指定できます。
要素 | 型 | 既定値 | 内容 |
---|---|---|---|
charset |
文字列 | "UTF-8" |
ファイルの文字エンコーディング |
compression |
文字列 | なし(非圧縮) | ファイルの圧縮コーデック |
compression
には、 "gzip"
または org.apache.hadoop.io.compress.CompressionCodec
のサブタイプのクラス名を指定します [1] 。
ここで指定した圧縮形式で対象のファイルが読み書きされるようになりますが、代わりにファイルの分割読み出しが行われなくなります。
以下はDMDLスクリプトの記述例です。
@directio.line(
charset="ISO-2022-jp",
compression="gzip",
)
model = {
...
};
[1] | org.apache.hadoop.io.compress.DefaultCodec などが標準で用意されています |
改行文字について¶
Direct I/O lineでは、ファイル内の改行文字を以下のように扱います。
- ファイルの入力時には CRLF または LF を改行文字として扱います。
- ファイルの出力時には、 LF を改行文字として出力します。
モデルプロパティの設定¶
Direct I/O lineで利用できるモデルプロパティの設定について説明します。
以下は、モデルプロパティの設定を指定したDMDLスクリプトの記述例です。
@directio.line
model = {
// 行文字列の格納(TEXT型)
@directio.line.body
body : TEXT;
// ファイルパスの格納(TEXT型)
@directio.line.file_name
path : TEXT;
// 行番号の格納(INTまたはLONG型)
@directio.line.line_number
num : INT;
// その他のプロパティは無視
other : TEXT;
};
行文字列用プロパティの指定¶
データモデル内で行文字列を格納するプロパティを指定するには、以下の属性をプロパティに指定します。
属性 | 型 | 内容 |
---|---|---|
@directio.line.body |
TEXT |
行文字列 |
データモデル内にプロパティが複数ある場合、この属性を付与したプロパティに行文字列が格納され、その他のプロパティは無視されます。
@directio.line.body
を指定できるプロパティは1つのみです。
なお、データモデル内に TEXT
型を持つプロパティが1つのみ存在するようにデータモデルを定義した場合、
@directio.line.body
を付与しなくても自動的にそのプロパティが行文字列を格納するプロパティとして自動認識されます。
先述の シンプルな例 で示すデータモデルの例はこの自動認識の機能が利用されています。
Attention
行文字列のプロパティ値が null
のデータモデルオブジェクトをファイルに出力した場合、行は追加されません。
ファイル情報の取得¶
解析中のファイルに関する属性を取得する場合、以下の属性をプロパティに指定します。
属性 | 型 | 内容 |
---|---|---|
@directio.line.file_name |
TEXT |
ファイル名 |
@directio.line.line_number |
INT , LONG |
テキスト行番号 (1起算) |
Attention
@directio.line.line_number
が指定された場合、 入力データの分割 が行われなくなります。
Attention
これらの属性はファイルを読み込みの解析時のみ有効です。 ファイルを書き出す際には無視されます。
データモデルクラス生成コマンド¶
データモデルクラスの生成は通常のDMDLで提供する方法と同様に、Gradleの compileDMDL タスクを実行して生成します。
./gradlew compileDMDL
Asakusa DSLの記述¶
Direct I/O lineを使った場合のAsakusa DSLの記述については、基本的な流れは他のデータフォーマットを使った場合と同様です。 詳しくは、 Direct I/O スタートガイド などを参照してください。
以下ではAsakusa DSLの記述に関して、Direct I/O lineと他のデータフォーマットで異なる部分についてのみ説明します。
ファイルシステム上のファイルを入力に利用する¶
処理対象のファイルをインポートしてHadoopの処理を行う場合、 データモデルクラスの生成 で生成した <パッケージ名>.line.Abstract<データモデル名>LineInputDescription
クラスのサブクラスを作成して必要な情報を記述します。
ファイルシステム上にファイルを出力する¶
ジョブフローの処理結果をファイルにエクスポートする場合、 データモデルクラスの生成 で生成した <パッケージ名>.line.Abstract<データモデル名>LineOutputDescription
クラスのサブクラスを作成して必要な情報を記述します。