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

[ 英語 | 日本語 ]

形式

Djoin [ -c] [ -k key-flags] [ -o output-spec] key-field-list input-file [input-file..]

DjnDjoinの短縮形(UNIXのみ)。

説明

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...'となる。

使用例

コードテーブル参照

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