2016-08-16 79 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