我尝试使用BigQuery加载作业从Apache Beam管道向BigQuery添加行。 I处理的初始数据来自Postgresql数据库,并使用JdbcIO
数据源读入Beam:
@Override
public PCollection<Intent> expand(PBegin input) {
return input.apply(JdbcIO.<Intent>read()
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration
.create(DASHBOARD_DB_DRIVER, getJdbcConnectionString()))
.withQuery(QUERY)
.withCoder(ProtoCoder.of(Intent.class))
.withRowMapper(new IntentParser()));
}
BigQuery编剧:
@Override
public WriteResult expand(PCollection<KV<StateTable, StateRow>> events) {
Write<KV<StateTable, StateRow>> writer = BigQueryIO.<KV<StateTable, StateRow>>write()
.withCreateDisposition(CreateDisposition.CREATE_NEVER)
.withWriteDisposition(WriteDisposition.WRITE_APPEND)
.withFormatFunction(new StateRowMapper())
.to(x -> x.getValue().getKey().getDestination());
return events.apply(writer);
}
当我执行管道时,我得到了数千个以下日志条目(我猜每行一个),这个过程需要很长时间(+10分钟)。
INFO: Opening TableRowWriter to gs://piesync-analytics-temp-storage/BigQueryWriteTemp/16b8edc635ac4dfcaf2494b0217be8f8/15a00ba8-70ff-43ad-99f7-0090b9465d0b.
Mar 14, 2018 12:13:46 PM org.apache.beam.sdk.io.gcp.bigquery.TableRowWriter <init>
我检查了Google云端存储中的临时文件(BigQuery加载作业所需),并注意到每个文件只包含1行数据。
我担心这一点,因为当我做同样的事情时,使用相同的数据,但是从文件而不是数据库中读取(使用TextIO
)我只会获得几十个日志条目并且临时文件包含数千条BigQuery记录。在这种情况下,该过程在不到一分钟的时间内完成
我没有指定任何窗口或触发,因为我只是尝试读取一次来源。
我想我必须启用某种批处理,但我不知道在哪里和哪里。