Djoin [ -c ] [ -k key-flags ] [ -o output-spec ] key-field-list input-file [ input-file.. ]
Djoinは,key-field-listフィールドの値による ジョイン演算を行う。 input-file が一つしか指定されなかった場合, 標準入力が2番目の入力ファイルとして使用される。 入力ファイルは3つ以上あってもよい。 これらは同時にジョインされる。 コアジョインオプション-c が指定されていない限り, すべての入力ファイルは, key-field-list のキー順にソートされていなければならない。 キー順が狂っていると Djoin はエラーメッセージを出して実行終了する。
入力ファイルすべては同時に読み込まれる。 同じキー値を持ったレコードはグループ化され, これらから以下のように出力レコードが作成される。
上記規則の例示のために, Dlの定数記法を使用する。
{ a:1 b:2 }
は,次のレコードを意味することにする。
a:1
b:2
すなわち,フィールド"a"の値が1で,フィールド"b"の値が2のDレコードである。
ファイル1が{ k:K a:1 }で, ファイル2が{ b:1 k:K }, ファイル3が{ c:1 k:K }のとき,
Djoin k file1 file2 file3
の結果は,次のようになる。
{ k:K a:1 b:1 c:1 }
同一キー値グループ内の入力レコードが1ファイルから複数ある場合,
file1: { k:K a:1 }, { k:K a:2 }
file2: { k:K b:1 }
file3: { k:K c:1 }, { k:K c:2 }
結果は次のようなフィールド構成とレコード順序になる。
{ k:K a:1 b:1 c:1 }
{ k:K a:1 b:1 c:2 }
{ k:K a:2 b:1 c:1 }
{ k:K a:1 b:1 c:2 }
また, Djoin はジョインするファイルの中に同一フィールド名があるかどうかについて関知しない。 ジョインされるレコード中に(キーフィールド以外で) 同じフィールド名があると,出力レコード中では リピーティングフィールドとなる。 これらのフィールドを区別したい場合,あらかじめリネームしておく必要がある。
標準では, Djoin はフルマッチのレコードのみ出力する (同一キー値のレコードがすべての入力フィルに存在しているグループのみ出力する)か, または先頭ファイルに存在するレコードのみ出力する (-cコアジョインのとき)。 しかし, オプション-o output-specによって, 任意の組み合わせのマッチング(アンマッチング)を選択することができる。
Output-spec は文字列で i 番目の文字が i 番目の入力ファイルに対応している。 各文字は次の意味を持つ。
オプション -o は複数あってもよい。 この場合,すべての オプション -oの論理和が取られる。
Key of join is specified with general ジョインするキーはDコマンドの一般 key-field-list として指定する。 2つ以上のフィールドを指定してもよい。 また,数値,大小文字無視,逆順などの指定もできる。
しかし,異なるフィールド名でジョインすることはできない。 ジョインのキーとなるフィールドは Drenameなどによって フィールド名をそろえておかなければならない。
ある条件の下では, キー順にソートされていないファイルをジョインできる。 これをコアジョインとよび, オプション-cが指定する。 コアジョインでは最初の入力ファイルは特別であり, 出力レコード順は最初のファイルに従う。 2番目以降の従属ファイルのレコードは, すべてメモリーに読み込まれ, その後,最初のファイルからレコードを読み込みながら メモリー上のこれらのレコードとのジョインを行う。 コアジョインは普通にはテーブル参照のような 場合に使われる。
コアジョインが可能となるための条件は,
従属ファイルをすべて読み込むに十分なメモリが必要である。 文字は内部コードで表され,これは,オペレーティングシステムに よって,1文字あたり2バイトであったり,4バイトであったりする。 さらに,キー値とB+treeのためのメモリも必要とされる。 正確にどれだけのメモリが必要となるかを計算するのは 難しいが,ファイルのサイズの2倍かそれ以上が必要と いうのが目安となる。
出力選択オプションには指定の制限がある。 最初のファイルに対する指定はマッチでなければならない。 ( -oオプションの先頭の文字は'1'でなければならない)。 オプション-oの指定のない場合, -o 1xxx...とする。 これは,通常のジョインの場合の省略時値-o 1111... と異なるので注意すること。
コアジョインの場合も出力は通常のジョインと同じで, 出力レコード順が異なるだけである。 特に,最初のファイルが既にキー順にソートされていれば, 結果は全く同じである (もちろん,同じ-oオプションが適用されている場合)。 この場合,通常のジョインの方が若干速い。
ファイル"countrycode.d"には次のようなレコードが入っている:
countrycode:jp
countryname:Japan
countrycode:us
countryname:United States
ファイル"city.d"には次のようなレコードが入っている:
city:Tokyo
countrycode:jp
city:New York
countrycode:us
...
どちらのファイルも"countrycode"でソートされている。ここで,
Djoin -o 1x countrycode city.d countrycode.d
コマンドは,`city.d'ファイルのレコードに 対応する`countryname'フィールドを付加する。
city:Tokyo
countrycode:jp
countryname:Japan
city:New York
countrycode:us
countryname:United States
...
"countrycode"の値が"countrycode.d"ファイル中にない場合, "city.d"ファイルのレコードは変更されない。
同じファイルが"countrycode"順にソートされていない場合,
Djoin -c countrycode city.d countrycode.d
とすることができる。この場合出力レコードは"city.d"ファイル の順となる。
ファイル"stopwds.d"にはストップワードが次のように入っている。
wd:of
wd:the
...
このファイルはwd:fキー(大小文字の区別をしないアルファベット順) でソートされている。
ファイル"words.d"には,文章中のワードが次のように入っている。
wd:Djoin
wd:joins
wd:the
...
この中からストップワード以外のワードだけを拾う。
Dsort wd:f words.d | Djoin -o 10 wd:f - stopwds.d
二つの入力ファイルから,アンマッチのレコードのみ抽出する。
Djoin -o 10 -o 01 key-filed input-file-1 input-file-2
キーフィールドは空列でもよい。
Djoin "" input-file-1 inpur-file-2
この演算により,input-file-1とinput-file-2の クロスプロダクションが生成される。 ただし,双方のファイルの全レコードを容れられるだけのメモリを必要とするので注意。
あるファイルがキー順にソートされているかどうかチェックするには, 片方のファイルをヌルファイルにしてDjoinすればよい。 Unixでは/dev/nullを, WindowsではNULを使う。
Djoin key input-file /dev/null
Djoin key input-file NUL
ちなみにDsortにはUnixの sort -cコマンドのようなシーケンスチェック機能はない。
マニュアル D_msg参照。
MIYAZAWA Akira