Google cloud dataflow 如何将SCOCollection元素保存到不同的BigQuery表?

Google cloud dataflow 如何将SCOCollection元素保存到不同的BigQuery表?,google-cloud-dataflow,apache-beam,spotify-scio,Google Cloud Dataflow,Apache Beam,Spotify Scio,我需要根据时间戳将scocollection元素保存到不同的BigQuery表中。我尝试了以下方法- 按(TableName,Iterable[TableRow])对元素进行分组,然后使用BigQueryClient实例将每个Iterable[TableRow]保存到各自的表中。这不起作用,因为BigQueryClient不可序列化 创建一个SCollection[TableName,PCollection[TableRow]],然后使用BigQueryIO将每个PCollection[Tabl

我需要根据时间戳将
scocollection
元素保存到不同的BigQuery表中。我尝试了以下方法-

  • (TableName,Iterable[TableRow])
    对元素进行分组,然后使用
    BigQueryClient
    实例将每个
    Iterable[TableRow]
    保存到各自的表中。这不起作用,因为
    BigQueryClient
    不可序列化

  • 创建一个
    SCollection[TableName,PCollection[TableRow]]
    ,然后使用
    BigQueryIO将每个
    PCollection[TableRow]
    保存到各自的BigQuery表中。写入
    。要创建
    PCollection[TableRow]
    对象,我使用
    .map(s.\u 1,sc.pipeline.apply(create.of(s.\u 2.toList.asJava))
    ,其中
    sc
    是上下文的一个实例。这不起作用,因为上下文
    不可序列化


  • 是否有办法将插入元素流式传输到不同的BigQuery表中?

    在Beam中,BigQuery IO转换提供了基于当前窗口选择表的功能。我相信Dataflow1.9对于依赖窗口的目的地也有类似的方法

    Dataflow2.0还包括。请参阅Javadoc,以获取基于每个元素中的用户ID选择表的示例


    我不熟悉Scio,但似乎从BigQuery IO公开底层方法是实现这一点的最简单方法。

    在Beam中,BigQuery IO转换提供了基于当前窗口选择表的功能。我相信Dataflow1.9对于依赖窗口的目的地也有类似的方法

    Dataflow2.0还包括。请参阅Javadoc,以获取基于每个元素中的用户ID选择表的示例


    我不熟悉Scio,但似乎从BigQuery IO中公开底层方法是实现这一点的最简单方法。

    要使用Scio实现这一点,您可以创建一个自定义输出转换,将数据写入
    DynamicDestinations
    对象()指定的目标。该表是由输入元素的某些特征动态确定的,在本例中是元素的事件时间(小时)

    BigQuery的自定义输出转换:

    import com.google.api.services.bigquery.model.TableSchema
    导入com.spotify.scio.bigquery.BigQueryUtil
    导入org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.Write.WriteDisposition
    导入org.apache.beam.sdk.io.gcp.bigquery_
    导入org.apache.beam.sdk.transforms.ptTransform
    导入org.apache.beam.sdk.values.{PCollection,PDone,ValueInSingleWindow}
    def saveAsBigQuery(tblPrefix:String,
    tblSchema:字符串,
    writeDisposition:writeDisposition):
    PTransform[PCollection[TableRow],PDone]={
    BigQueryIO.writeTableRows()
    .to(新的DynamicDestinations[表格行,字符串]{
    重写def getTable(tblSuffix:String):TableDestination={
    //TODO:构造表名
    val tblName=“%s_u%s”。格式(tblPrefix,tblSuffix)
    新的TableDestination(tblName,null)
    }
    覆盖def getDestination(tblRow:ValueInSingleWindow[TableRow]):字符串={
    //TODO:根据tblRow对象中的事件时间确定小时表后缀
    }
    覆盖def getSchema(目标:字符串):表模式={
    BigQueryUtil.parseSchema(tblSchema)
    }
    })
    .带写位置(写位置)
    .A.A[P转换[P集合[TableRow],PDone]]
    }
    
    使用上述函数应用自定义输出变换:

    import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.Write
    val tblPrefix=“表格前缀”
    val tblSchema=“table_schema”//TODO:需要采用有效的BigQuery架构格式
    val writeDisposition=Write.writeDisposition.Write\u追加
    val bqTransform=saveAsBigQuery(
    tblPrefix,
    tblSchema,
    写入位置)
    //假设tblRows是一个集合[TableRow]
    tblRows.saveAsCustomOutput(“saveAsBigQuery”,bqTransform)
    
    要使用Scio执行此操作,您可以创建一个自定义输出转换,该转换将写入
    DynamicDestinations
    对象()指定的目标。该表是由输入元素的某些特征动态确定的,在本例中是元素的事件时间(小时)

    BigQuery的自定义输出转换:

    import com.google.api.services.bigquery.model.TableSchema
    导入com.spotify.scio.bigquery.BigQueryUtil
    导入org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.Write.WriteDisposition
    导入org.apache.beam.sdk.io.gcp.bigquery_
    导入org.apache.beam.sdk.transforms.ptTransform
    导入org.apache.beam.sdk.values.{PCollection,PDone,ValueInSingleWindow}
    def saveAsBigQuery(tblPrefix:String,
    tblSchema:字符串,
    writeDisposition:writeDisposition):
    PTransform[PCollection[TableRow],PDone]={
    BigQueryIO.writeTableRows()
    .to(新的DynamicDestinations[表格行,字符串]{
    重写def getTable(tblSuffix:String):TableDestination={
    //TODO:构造表名
    val tblName=“%s_u%s”。格式(tblPrefix,tblSuffix)
    新的TableDestination(tblName,null)
    }
    覆盖def getDestination(tblRow:ValueInSingleWindow[TableRow]):字符串={
    //TODO:根据tblRow对象中的事件时间确定小时表后缀
    }
    覆盖def getSchema(目标:字符串):表模式={
    BigQueryUtil.parseSchema(tblSchema)
    }
    })
    .带写位置(写位置)
    .A.A[P转换[P集合[TableRow],PDone]]
    }
    
    使用上述函数应用自定义输出变换:

    import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO.Write
    val tblPrefix=“表格前缀”
    val tblSchema=“table_schema”//TODO:需要采用有效的BigQuery架构格式
    val writeDisposition=Write.writeDisposition.Write\u追加
    val bqTransform=saveAsBi