Google bigquery 在Apache Beam中维护全局状态

Google bigquery 在Apache Beam中维护全局状态,google-bigquery,google-cloud-dataflow,apache-beam,google-cloud-pubsub,spotify-scio,Google Bigquery,Google Cloud Dataflow,Apache Beam,Google Cloud Pubsub,Spotify Scio,我们有一个PubSub主题,其中的事件沉入BigQuery(尽管特定的DB在这里几乎不相关)。事件可能带有新的未知属性,这些属性最终将作为单独的BigQuery列结束 基本上我有两个问题: 在管道中维护全局状态的正确方法是什么(在我的例子中是一组遇到的属性) 在遇到新属性并执行ALTER TABLE之前,缓冲/保存事件流的好策略是什么 现在,我尝试使用以下内容(我正在使用Spotify scio): 但这是非常低效的,因为我们至少需要将整个rowsIterable加载到内存中,甚至遍历它。我们正

我们有一个PubSub主题,其中的事件沉入BigQuery(尽管特定的DB在这里几乎不相关)。事件可能带有新的未知属性,这些属性最终将作为单独的BigQuery列结束

基本上我有两个问题:

  • 在管道中维护全局状态的正确方法是什么(在我的例子中是一组遇到的属性)
  • 在遇到新属性并执行
    ALTER TABLE
    之前,缓冲/保存事件流的好策略是什么
  • 现在,我尝试使用以下内容(我正在使用Spotify scio):


    但这是非常低效的,因为我们至少需要将整个
    rowsIterable
    加载到内存中,甚至遍历它。

    我们正在构建同一个项目,并且我们正在使用包含模式的刷新侧输入(从BQ开始每隔一段时间刷新)。所以基本上:

  • 在输入端,从BQ加载模式
  • 使用流模式将数据流到BQ中,这样您就可以对插入失败的行执行其他操作(即:当它们具有新的未知属性时)
  • 将那些失败的保存到其他地方(数据存储?)以便以后处理(例如,在另一个作业中)
  • 该恢复作业将发出架构更改,最终将由主管道刷新端输入加载(步骤1)
  • 我有一个工作的例子,使用了这种令人耳目一新的输入方法

    rows
      .withFixedWindows(Duration.millis(duration))
      .withWindow[IntervalWindow]
      .swap
      .groupByKey
      .map { case (window, rowsIterable) =>
        val newRows = findNewProperties(rowsIterable)
        mutateTableWith(newRows)
        rowsIterable
      }
      .flatMap(id)
      .saveAsBigQuery()