使用Scio并明确指定TriggeringFrequency

时间:2019-06-17 08:02:32

标签: scala google-bigquery apache-beam spotify-scio

我正在使用Spotify Scio创建一个由Pub/Sub消息触发的Scala Dataflow管道。它从我们的私有DB中读取,然后将信息插入BigQuery中。

问题是:

  • 我需要删除以前的数据
  • 为此,我需要使用写处置WRITE_TRUNCATE
  • 但是,该作业会自动注册为流式传输,因此出现以下错误:WriteDisposition.WRITE_TRUNCATE is not supported for an unbounded PCollection
  • 因此,我需要手动将管道更改为Batch管道,并指定触发频率。

所以到目前为止,我有以下管道:

sc
  .customInput("Job Trigger", inputIO)
  .map(handleUserInformationRetrieval(dbOperationTimeout, projectName))
  .flatten
  .withGlobalWindow(options = windowOptions(windowingOutputTriggerDuration))
  .groupBy(_.ssoId)
  .map { case (ssoId, userDataCollection) => Schemas.toTableRow(ssoId, userDataCollection) }
  .filter(_.isSuccess)
  .map(_.get)
  .saveAsBigQuery(tableName, getSchema, WRITE_TRUNCATE, CREATE_NEVER)

使用scio API(saveAsBigQuery)时,似乎找不到指定触发频率的方法。

它仅在本地beam api中出现:

BigQueryIO
  .write()
  .withTriggeringFrequency(Duration.standardDays(1)) // This is what I'm after
  .to(bqTableName)
  .withSchema(getSchema)
  .withCreateDisposition(CREATE_NEVER)
  .withWriteDisposition(WRITE_TRUNCATE)

如果使用BigQueryIO,则必须使用sc.pipeline.apply而不是当前的管道。

是否可以通过某种方式将BigQueryIO集成到我当前的管道中,或者以某种方式在当前管道上指定withTriggeringFrequency

1 个答案:

答案 0 :(得分:0)

Scio当前不支持指定用于将数据加载到Big Query的方法。由于这是不可能的,因此自动STREAMING_INSERTS用于无界集合,这显然不支持截断。因此,您需要回退到Beam的BigQueryIO,并指定触发频率(withTriggeringFrequency(...))和方法(withMethod(Method.FILE_LOADS))。

要将其集成到Scio管道中,只需使用saveAsCustomOutput。 也可以在此处找到示例:https://spotify.github.io/scio/io/Type-Safe-BigQuery#using-type-safe-bigquery-directly-with-beams-io-library