2015-09-14 28 views
1

我有一個Kettle變換,它將數據插入多個數據庫表中。對於每個表都有一個單獨的轉換(使用注入步驟),它進行一些計算,檢查數據並最終插入。這些子轉換使用single threader步驟調用。確保步驟順序在水壺中運行?

主要轉型看起來是這樣的:

Input from -----> Dummy -----> Dummy -----> Dummy -----> Done 
    file    |   |   | 
        |   |   | 
        v   v   v 
        Select  Select  Select 
        values  values  values 
        |   |   | 
        |   |   | 
        v   v   v 
        Single  Single  Single 
       threader 1 threader 2 threader 3 

我的問題是,我想確保Single threader 1完成對前Single threader 2運行該行,依此類推特定行。這是因爲第一個單線程在一個表中添加了一個帖子,然後應該在後面的表中引用該帖子,並且如果插入了對不存在(尚)的帖子的引用,則數據庫將引發錯誤。

我不能把單線程放在一條線上,因爲我需要放棄總共大約50個的幾個域來匹配單線程的注入器。這就是select values所做的。

我該如何解決這個問題?

+0

你有沒有看一步「阻止這一步,直到步驟完成」? – simar

+0

@simar是的,但我不知道如何使用它。如果我理解正確,它會阻止,直到* all *行已經通過一個步驟。這意味着我所有的行(10k +)需要緩衝到某個位置,再加上我不能利用並行性。我只想阻止,直到*一行*通過某個步驟。 – Anders

+0

那麼如果你不需要廣泛的數據轉換操作,當我不認爲這是一個問題(或者你可以在開始執行DDL之前準備好所有數據)。在JDBC中批量插入非常有效。根據我個人的經驗,超過百萬條記錄在10秒內寫入DB – simar

回答

1

這裏是例如這樣的情況下

create table a (id serial primary key, md5 text not null); 
create table b (id serial primary key, md5 text not null, a_id int not null); 
create table c (id serial primary key, md5 text not null, a_id int not null, b_id int not null); 

而且例如穿越 -

enter image description here

的我假定數據是平坦的,使得每一行的開頭有數據的所有表A, B和C.

+0

謝謝你的回答。我的問題是單線程的注入步驟只需要所有字段的一小部分,所以我必須使用選擇值步驟刪除一些。如果我把它們全部放在一條直線上,那麼單個穿線器3所需的大部分場將在單線穿線器1之前被移除。 – Anders

+0

在此示例中,「選擇值」步驟在那裏刪除不必要的字段,例如在我插入表ai不需要a_md5字段後,我刪除它,但沒有字段b_md5和c_md5,因爲它們將在未來的步驟中使用。 – simar