Google bigquery BigQueryIO.readTableRows-不存在类型变量的实例,因此PCollection<;长期>;符合PBegin标准
我想在Beam中每小时从BigQuery中读取数据,并编写以下代码: 但此错误Google bigquery BigQueryIO.readTableRows-不存在类型变量的实例,因此PCollection<;长期>;符合PBegin标准,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,我想在Beam中每小时从BigQuery中读取数据,并编写以下代码: 但此错误不存在类型变量的实例,因此出现了符合PBegin的PCollection。有没有办法解决这个问题 我已通过DoFn进行了如下尝试。但是,我没有找到一种方法将TypedRead转换为MyData pipeline.apply("Generate Sequence", GenerateSequence.from(0).withRate(1, Duration.standardHo
不存在类型变量的实例,因此出现了符合PBegin的PCollection
。有没有办法解决这个问题
我已通过DoFn
进行了如下尝试。但是,我没有找到一种方法将TypedRead
转换为MyData
pipeline.apply("Generate Sequence",
GenerateSequence.from(0).withRate(1, Duration.standardHours(1)))
.apply(Window.into(FixedWindows.of(Duration.standardHours(1))))
.apply("Read Row from BQ query", ParDo.of(new ReadBQParDo()))
.apply("Map TableRow", ParDo.of(new MapTableRow()))
static class ReadBQParDo extends DoFn<Long, BigQueryIO.TypedRead<TableRow>> {
@ProcessElement
public void processElement(ProcessContext pc) {
BigQueryIO.TypedRead<TableRow> rows = BigQueryIO.readTableRows()
.fromQuery("select col1, col2, col3 from project.market.table")
.usingStandardSql();
pc.output(rows);
}
}
static class MapTableRow extends DoFn<BigQueryIO.TypedRead<TableRow>, MyData> {
@ProcessElement
public void processElement(ProcessContext pc) {
// stuck here, how to convert TypedRead<TableRow> to MyData??
}
}
pipeline.apply(“生成序列”,
GenerateSequence.from(0).withRate(1,Duration.standardHours(1)))
.apply(Window.into(FixedWindows.of(Duration.standardchours(1)))
.apply(“从BQ查询中读取行”,ParDo.of(new ReadBQParDo())
.apply(“Map TableRow”,ParDo.of(new MapTableRow()))
静态类ReadBQParDo扩展了DoFn{
@过程元素
公共无效processElement(ProcessContext pc){
BigQueryIO.TypedRead行=BigQueryIO.readTableRows()
.fromQuery(“从project.market.table中选择col1、col2、col3”)
.使用标准SQL();
pc.输出(行);
}
}
静态类MapTableRow扩展了DoFn{
@过程元素
公共无效processElement(ProcessContext pc){
//卡在这里,如何将TypedRead转换为MyData??
}
}
Beam版本:2.23.0在您的第一个代码片段中,
BigQueryIO.readTableRows()
必须位于管道的根,即它是一个PTransform
。您试图将其应用于GenerateSequence
的输出,这是一个PCollection
在第二种情况下,您不能在DoFn中使用PTransforms(除非您确实尝试为每个元素启动一个新的波束管道)。这是一个流式管道,您是否尝试将BQ行作为侧输入读取?@JayadeepJayaraman,是的,将BQ行作为侧输入读取,并将gcs中的数据作为流式管道读取。出于好奇,为什么
BigQueryIO.readTableRows()
必须位于管道的根目录下?它就是这样编写的。有了它,你就可以编写一个可以在管道中任何地方运行的程序。
pipeline.apply("Generate Sequence",
GenerateSequence.from(0).withRate(1, Duration.standardHours(1)))
.apply(Window.into(FixedWindows.of(Duration.standardHours(1))))
.apply("Read Row from BQ query", ParDo.of(new ReadBQParDo()))
.apply("Map TableRow", ParDo.of(new MapTableRow()))
static class ReadBQParDo extends DoFn<Long, BigQueryIO.TypedRead<TableRow>> {
@ProcessElement
public void processElement(ProcessContext pc) {
BigQueryIO.TypedRead<TableRow> rows = BigQueryIO.readTableRows()
.fromQuery("select col1, col2, col3 from project.market.table")
.usingStandardSql();
pc.output(rows);
}
}
static class MapTableRow extends DoFn<BigQueryIO.TypedRead<TableRow>, MyData> {
@ProcessElement
public void processElement(ProcessContext pc) {
// stuck here, how to convert TypedRead<TableRow> to MyData??
}
}