2

次のデータを持つ 2 つの PostgreSQL テーブルがあります。

:

-# select * from houses;
 id |    address
----+----------------
  1 | 123 Main Ave.
  2 | 456 Elm St.
  3 | 789 County Rd.
(3 rows)

そして人々

-# select * from people;
 id | name  | house_id
----+-------+----------
  1 | Fred  |        1
  2 | Jane  |        1
  3 | Bob   |        1
  4 | Mary  |        2
  5 | John  |        2
  6 | Susan |        2
  7 | Bill  |        3
  8 | Nancy |        3
  9 | Adam  |        3
(9 rows)

Spoon には、SQL を持つHouse Inputという名前の最初の2 つのテーブル入力があります。

SELECT
  id
, address
FROM houses
ORDER BY id;

2 番目のテーブル入力は、次の SQL を使用してPeople Inputという名前になります。

SELECT
  "name"
, house_id
FROM people
ORDER BY house_id;

のキーを持つ最初のステップとしてHouse Inputを使用し、 のキーを持つ 2 番目のステップとして People Input を使用するMerge Join両方のテーブル入力を入れています。idhouse_id

次に、これをMongoDb 出力に入れ、データベースdemo、コレクションハウス、および Mongo ドキュメント フィールドaddressname. (MongoDB が を割り当てることを期待しているため_id)。

db.houses.find();Mongo シェルから変換と入力を実行すると、次のようになります。

{ "_id" : ObjectId("52083706b251cc4be9813153"), "address" : "123 Main Ave.", "name" : "Fred" }
{ "_id" : ObjectId("52083706b251cc4be9813154"), "address" : "123 Main Ave.", "name" : "Jane" }
{ "_id" : ObjectId("52083706b251cc4be9813155"), "address" : "123 Main Ave.", "name" : "Bob" }
{ "_id" : ObjectId("52083706b251cc4be9813156"), "address" : "456 Elm St.", "name" : "Mary" }
{ "_id" : ObjectId("52083706b251cc4be9813157"), "address" : "456 Elm St.", "name" : "John" }
{ "_id" : ObjectId("52083706b251cc4be9813158"), "address" : "456 Elm St.", "name" : "Susan" }
{ "_id" : ObjectId("52083706b251cc4be9813159"), "address" : "789 County Rd.", "name" : "Bill" }
{ "_id" : ObjectId("52083706b251cc4be981315a"), "address" : "789 County Rd.", "name" : "Nancy" }
{ "_id" : ObjectId("52083706b251cc4be981315b"), "address" : "789 County Rd.", "name" : "Adam" }

私が取得したいのは次のようなものです:

{ "_id" : ObjectId("52083706b251cc4be9813153"), "address" : "123 Main Ave.", "people" : [
        { "_id" : ObjectId("52083706b251cc4be9813154"), "name" : "Fred"} ,
        { "_id" : ObjectId("52083706b251cc4be9813155"), "name" : "Jane" } ,
        { "_id" : ObjectId("52083706b251cc4be9813155"), "name" : "Bob" }
    ]  
},
{ "_id" : ObjectId("52083706b251cc4be9813156"), "address" : "345 Elm St.", "people" : [
        { "_id" : ObjectId("52083706b251cc4be9813157"), "name" : "Mary"} ,
        { "_id" : ObjectId("52083706b251cc4be9813158"), "name" : "John" } ,
        { "_id" : ObjectId("52083706b251cc4be9813159"), "name" : "Susan" }
    ]  
},
{ "_id" : ObjectId("52083706b251cc4be981315a"), "address" : "789 County Rd.", "people" : [
        { "_id" : ObjectId("52083706b251cc4be981315b"), "name" : "Mary"} ,
        { "_id" : ObjectId("52083706b251cc4be981315c"), "name" : "John" } ,
        { "_id" : ObjectId("52083706b251cc4be981315d"), "name" : "Susan" }
     ]
 }

}

なぜ私が得ているものを手に入れているのかはわかっていますが、オンラインや例では、私が望む場所に私を連れて行くための何かを見つけることができないようです.

誰かが私を正しい方向に動かしたり、私が達成しようとしていることに近い例を指摘したり、これは Kettle が行うべきことの範囲外であることを教えてくれることを望んでいました (後者ではないことを願っています)。

4

1 に答える 1

0

サブテーブルの作成はすべてMongoDB 出力ステップで行われます。

最初に、[接続の構成] タブでUpsertModifier の更新がオンになっていることを確認します。

次に、Mongo Documents フィールドタブで次のように入力します (最初の行は列名です)。

Name    | Mongo document Path | Use field name | Match field for upsert | Modifier operation | Modifier policy
--------+---------------------+----------------+------------------------|--------------------+---------------- 
address |                     | Y              | N                      | N/A                | Insert
address |                     | Y              | Y                      | N/A                | Insert
name    | people[0]           | Y              | N                      | $set               | Insert
name    | people[1]           | Y              | N                      | $push              | Update

実行すると、次のようdb.houses.find();になります。

{ "_id" : ObjectId("520ccb8978d96b204daa029d"), "address" : "123 Main Ave.", "people" : [ { "name" : "Fred" }, { "name" : "Jane" }, { "name" : "Bob" } ] }
{ "_id" : ObjectId("520ccb8978d96b204daa029e"), "address" : "456 Elm St.", "people" : [ { "name" : "Mary" }, { "name" : "John" }, { "name" : "Susan" } ] }
{ "_id" : ObjectId("520ccb8a78d96b204daa029f"), "address" : "789 County Rd.", "people" : [ { "name" : "Bill" }, { "name" : "Nancy" }, { "name" : "Adam" } ] }

私が注意したい2つのこと:

  1. これは、私の住所が一意であり、私の名前が家の中で一意であることを前提としています。そうでない場合は、OLTP テーブルから MongoDB の id (_id ではない) フィールドに id を作成し、ハウス idのフィールド upsert に一致させる必要があります。
  2. @G Gordon Worley III が上で指摘したように、これらの 2 つのテーブルが同じデータベースにある場合、Table Outputステップで結合を行うことができ、これは 2 ステップの変換になります (そしてより高速になります)。
于 2013-08-15T12:45:19.997 に答える