2016-08-16 126 views
1

我想在我的Dataflow Pipeline上實現一個ParDo Transformer,它基本上根據每個要處理的元素提供的數據查詢關係數據庫。我知道用戶定義的變換器中的每個屬性都必須是可序列化的,但要將數據查詢到數據庫,使用jdbc我需要創建一個Connection,它是自然不可序列化的對象。通過Google DataFlow Transformer查詢關係數據庫

在Dataflow Pipeline上下文中仍然可以這麼做嗎?

+0

請參閱http://stackoverflow.com/help/how-to-ask。如果某人回答「是」,而其他人回答「否」,您會接受哪一個? – zhon

回答

3

是的,這是可能的。你可以使你的Connection對象是暫態的,這樣它就不會被序列化,並且通過startBundle方法在每個包中創建一次。一旦處理了包中的所有元素,就可以通過finishBundle方法關閉連接。

class MyDoFn extends DoFn<X, Y> { 
    private transient Connection jdbc; 

    @Setup 
    public void setup(Context c) { 
    jdbc = // Create connection 
    } 

    @ProcessElement 
    public void processElement(ProcessContext c) { 
    // query database 
    } 

    @Teardown 
    public void tearDown(Context c) { 
    // close connection 
    } 
} 
0

請也看到了最近在Apache Beam (incubating)添加JDBC connector

+0

在這個問題的上下文中使用JDBC連接器是不可能的,因爲使用它作爲源是爲了讀取數據流,因此允許在初始化期間提供查詢。 這並不意味着,因此不允許根據來自另一個流的傳入元素進行查詢。 – erankl