I don’t think so because this statement [1] is used in this case. 
 
[1] 
https://github.com/apache/beam/blob/97af0775cc19a4997a4b60c6a75d003f8e86cf1f/sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/JdbcUtil.java#L56

> On 14 Apr 2021, at 14:44, Thomas Fredriksen(External) 
> <thomas.fredrik...@cognite.com> wrote:
> 
> This seems very promising,
> 
> Will the write from PCollectino<Row> handle upserts?
> 
> On Wed, Mar 24, 2021 at 6:56 PM Alexey Romanenko <aromanenko....@gmail.com 
> <mailto:aromanenko....@gmail.com>> wrote:
> Thanks for details.
> 
> If I’m not mistaken, JdbcIO already supports both your suggestions for read 
> and write (at lest, in some way) [1][2]. 
> 
> Some examples from tests:
> - write from PCollection<Row> [3], 
> - read to PCollection<Row> [4], 
> - write from PCollection<POJO> with JavaBeanSchema [5] 
> 
> Is it something that you are looking for?
> 
> [1] https://issues.apache.org/jira/browse/BEAM-6674 
> <https://issues.apache.org/jira/browse/BEAM-6674>
> [2] https://github.com/apache/beam/pull/8725 
> <https://github.com/apache/beam/pull/8725>
> [3] 
> https://github.com/apache/beam/blob/ab1dfa13a983d41669e70e83b11f58a83015004c/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java#L469
>  
> <https://github.com/apache/beam/blob/ab1dfa13a983d41669e70e83b11f58a83015004c/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java#L469>
> [4] 
> https://github.com/apache/beam/blob/ab1dfa13a983d41669e70e83b11f58a83015004c/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java#L524
>  
> <https://github.com/apache/beam/blob/ab1dfa13a983d41669e70e83b11f58a83015004c/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java#L524>
> [5] 
> https://github.com/apache/beam/blob/ab1dfa13a983d41669e70e83b11f58a83015004c/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java#L469
>  
> <https://github.com/apache/beam/blob/ab1dfa13a983d41669e70e83b11f58a83015004c/sdks/java/io/jdbc/src/test/java/org/apache/beam/sdk/io/jdbc/JdbcIOTest.java#L469>
> 
> 
>> On 23 Mar 2021, at 08:03, Thomas Fredriksen(External) 
>> <thomas.fredrik...@cognite.com <mailto:thomas.fredrik...@cognite.com>> wrote:
>> 
>> That is a very good question.
>> 
>> Personally, I would prefer that read and write were simplified. I guess 
>> there will always be a need for writing complex queries, but the vast 
>> majority of pipelines will only need to read or write data to or from a 
>> table. As such, having read/write functions that will take an input-class 
>> (BEAN or POJO for example) and simply generate the required write-statement 
>> would be sufficient. Upserts should also be a part of this.
>> 
>> For example:
>> 
>> ```
>> PCollection<MyBean> collection = ...;
>> collection.apply("Write to database", JdbcIO.writeTable(MyBean.class)
>>         .withDataSourceConfiguration(mySourceConfiguration)
>>         .withTableName(myTableName)
>>         .withUpsertOption(UpsertOption.create()
>>                 .withConflictTarget(keyColumn)
>>                 .withDoUpdate());
>> ```
>> This would of course assume that the columns of `myTableName` would match 
>> the members of `MyBean`.
>> 
>> There are of course technical challenges with this:
>> * How to handle situations where the column names do not match the input-type
>> * How to detect columns from the input-type.
>> 
>> As an alternative, schemas may be an option:
>> 
>> ```
>> PCollection<Row> collection = ...;
>> collection.apply("Write to database", JdbcIO.writeRows()
>>         .withSchema(mySchema)
>>         .withDataSourceConfiguration(mySourceConfiguration)
>>         .withTableName(myTableName)
>>         .withUpsertOption(UpsertOption.create()
>>                 .withConflictTarget(keyColumn)
>>                 .withDoUpdate());
>> ```
>> This would allow for greater flexibility, but we lose the type-strong nature 
>> of first suggestion.
>> 
>> I hope this helps.
>> 
>> Best Regards
>> Thomas Li Fredriksen
>> 
>> On Fri, Mar 19, 2021 at 7:17 PM Alexey Romanenko <aromanenko....@gmail.com 
>> <mailto:aromanenko....@gmail.com>> wrote:
>> Hmm, interesting question. Since we don’t have any answers yet may I ask you 
>> a question - do you have an example of what like this could be these 
>> practises or how it can be simplified?
>> 
>> 
>> PS: Not sure that it can help but JdbcIO allows to set a query with 
>> “ValueProvider” option which can be helpful to parametrise your transform 
>> with values that are only available during pipeline execution and can be 
>> used for pipeline templates [1].
>> 
>> [1] 
>> https://cloud.google.com/dataflow/docs/guides/templates/creating-templates 
>> <https://cloud.google.com/dataflow/docs/guides/templates/creating-templates>
>> 
>> > On 17 Mar 2021, at 14:06, Thomas Fredriksen(External) 
>> > <thomas.fredrik...@cognite.com <mailto:thomas.fredrik...@cognite.com>> 
>> > wrote:
>> > 
>> > Hello everyone,
>> > 
>> > I was wondering what is considered best-practice when writing SQL 
>> > statements for the JdbcIO connector?
>> > 
>> > Hand-writing the statements and subsequent preparedStatementSetter causes 
>> > a lot of bloat and is not very manageable.
>> > 
>> > Thank you/
>> > 
>> > Best Regards
>> > Thomas Li Fredriksen
>> 
> 

Reply via email to