Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery BigQueryIO.readTableRows-不存在类型变量的实例,因此PCollection<;长期>;符合PBegin标准_Google Bigquery_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Google bigquery BigQueryIO.readTableRows-不存在类型变量的实例,因此PCollection<;长期>;符合PBegin标准

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

我想在Beam中每小时从BigQuery中读取数据,并编写以下代码:

但此错误
不存在类型变量的实例,因此出现了符合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??
    }
}