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