Direct I/O line

Direct I/Oで任意のテキストファイルを行ごとに読み書きするための機能として、「Direct I/O line」を利用することができます。

Direct I/O lineはファイル内の行文字列とデータモデル内の1つの文字列型プロパティをマッピングする機能のみを提供します。 行文字列の解析、生成などの処理はバッチアプリケーションの演算子として記述します。

Direct I/O lineは、以下のような用途に利用することを想定しています。

  • Direct I/Oが対応していないファイルフォーマットの入出力
    • 例えば LTSV などのフォーマットを扱う場合に、行文字列をパースする処理と組み合わせて利用します。
  • 入力ファイルの整形や形式変換、バリデーションチェックなどの事前処理
    • 例えば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 属性には、次のような要素を指定できます。

Direct I/O 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 クラスのサブクラスを作成して必要な情報を記述します。