Djoin - キーフィールド値によるDファイルのジョイン・マッチング

[ 英語 | 日本語 ]

[Dホームページへ]

形式

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 はエラーメッセージを出して実行終了する。

マッチング

入力ファイルすべては同時に読み込まれる。 同じキー値を持ったレコードはグループ化され, これらから以下のように出力レコードが作成される。

  1. グループに各入力ファイルからゼロまたは1レコードづつしかない場合, 出力レコードは1つだけ作成される。 このレコードにはグループの最初のレコードの全フィールドに, グループの2番目のレコードからキーフィールドを除く全フィールドが続き, グループの3番目のレコードから…,と同様に続く。
  2. グループに,ある一つの入力ファイルから複数のレコードがあった場合, これらのレコードの,ケース1と同様のフィールド構成を持つ直積が 作成され,それらが出力される。 直積の各レコードの出力順は, 「下位レコードが先に変化する」という規則による。

上記規則の例示のために, 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 番目の入力ファイルに対応している。 各文字は次の意味を持つ。

1
マッチ: 出力レコードとして対応する入力ファイルからの入力があったグループが選択される。
0
アンマッチ: 出力レコードとして対応する入力ファイルからの入力がなかったグループが選択される。
x
DON'T CARE: そのファイルからの入力レコードの有無は関係しない。

オプション -o は複数あってもよい。 この場合,すべての オプション -oの論理和が取られる。

キーフィールド

Key of join is specified with general ジョインするキーはDコマンドの一般 key-field-list として指定する。 2つ以上のフィールドを指定してもよい。 また,数値,大小文字無視,逆順などの指定もできる。

しかし,異なるフィールド名でジョインすることはできない。 ジョインのキーとなるフィールドは Drenameなどによって フィールド名をそろえておかなければならない。

コアジョイン

ある条件の下では, キー順にソートされていないファイルをジョインできる。 これをコアジョインとよび, オプション-cが指定する。 コアジョインでは最初の入力ファイルは特別であり, 出力レコード順は最初のファイルに従う。 2番目以降の従属ファイルのレコードは, すべてメモリーに読み込まれ, その後,最初のファイルからレコードを読み込みながら メモリー上のこれらのレコードとのジョインを行う。 コアジョインは普通にはテーブル参照のような 場合に使われる。

コアジョインが可能となるための条件は,

  1. メモリサイズと
  2. 出力選択(-o)オプションである。

従属ファイルをすべて読み込むに十分なメモリが必要である。 文字は内部コードで表され,これは,オペレーティングシステムに よって,1文字あたり2バイトであったり,4バイトであったりする。 さらに,キー値とB+treeのためのメモリも必要とされる。 正確にどれだけのメモリが必要となるかを計算するのは 難しいが,ファイルのサイズの2倍かそれ以上が必要と いうのが目安となる。

出力選択オプションには指定の制限がある。 最初のファイルに対する指定はマッチでなければならない。 ( -oオプションの先頭の文字は'1'でなければならない)。 オプション-oの指定のない場合, -o 1xxx...とする。 これは,通常のジョインの場合の省略時値-o 1111... と異なるので注意すること。

コアジョインの場合も出力は通常のジョインと同じで, 出力レコード順が異なるだけである。 特に,最初のファイルが既にキー順にソートされていれば, 結果は全く同じである (もちろん,同じ-oオプションが適用されている場合)。 この場合,通常のジョインの方が若干速い。

オプション

-c
コアジョイン; 入力ファイルがキー順にソートされていなくてもジョインする。
-k key-flags
key-field-list の省略時のキーフラグ値を与える。 この値は, key-field-list のエントリにフラグが指定されていない場合に効力を持つ。 マニュアル Dintro参照。
-o output-spec
マッチングパターンによる出力レコードの選択。 output-spec の文字数がが入力ファイルの数より少ない意場合, 後のファイルにはDO'NT CAREが仮定される。
また,DON'T CAREでは x, のかわりに,1または0以外のどんな文字を使ってもよい。 ただ,読みやすさを考慮して x の使用を推奨する。
省略時の値は通常のジョインでは'1111...', コアジョインでは'1xxx...'となる。
-D [i/o]datautf=8|16|32
UTF入出力機能参照。

環境変数

Ddatautf, Didatautf, Dodatautf
UTF入出力機能参照。

使用例

コードテーブル参照

ファイル"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参照。

参照

DintroDpasteDsortD_msg

AUTHOR

MIYAZAWA Akira


miyazawa@nii.ac.jp
2003-2004