繁体   English   中英

从Google Cloud BigQuery读取数据

[英]Reading data from Google Cloud BigQuery

我是Pipeline世界和Google API DataFlow的新手。

我想使用sqlQuery从BigQuery读取数据。 当我读取所有数据库时,它工作正常。

PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
PCollection<TableRow> qData = p.apply(
     BigQueryIO.Read
         .named("Read")
         .from("test:DataSetTest.data"));

但是当我使用fromQuery时出现错误。

PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
PCollection<TableRow> qData = p.apply(
     BigQueryIO.Read
         .named("Read")
         .fromQuery("SELECT * FROM DataSetTest.data"));

错误:

线程“主”中的异常java.lang.IllegalArgumentException:查询“ SELECT * FROM DataSetTest.data”的验证失败。 如果查询取决于管道的早期阶段,则可以使用#withoutValidation禁用此验证。

com.google.cloud.dataflow.sdk.io.BigQueryIO $ Read $ Bound.dryRunQuery(BigQueryIO.java:449)

com.google.cloud.dataflow.sdk.io.BigQueryIO $ Read $ Bound.validate(BigQueryIO.java:432)

在com.google.cloud.dataflow.sdk.Pipeline.applyInternal(Pipeline.java:357)

在com.google.cloud.dataflow.sdk.Pipeline.applyTransform(Pipeline.java:267)

在com.google.cloud.dataflow.sdk.values.PBegin.apply(PBegin.java:47)

在com.google.cloud.dataflow.sdk.Pipeline.apply(Pipeline.java:151)

在Test.java.packageid.StarterPipeline.main(StarterPipeline.java:72)

原因:java.lang.NullPointerException:必须指定必需的参数projectId。

在com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:229)

在com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:140)

com.google.api.services.bigquery.Bigquery $ Jobs $ Query。(Bigquery.java:1751)

在com.google.api.services.bigquery.Bigquery $ Jobs.query(Bigquery.java:1724)

com.google.cloud.dataflow.sdk.io.BigQueryIO $ Read $ Bound.dryRunQuery(BigQueryIO.java:445)

...另外6个

这里有什么问题?

更新:

我通过“ options.setProject”设置项目。

PipelineOptions options = PipelineOptionsFactory.create();
    Pipeline p = Pipeline.create(options);
    options.setProject("test");
    PCollection<TableRow> qData = p.apply(
         BigQueryIO.Read
             .named("Read")
             .fromQuery("SELECT * FROM DataSetTest.data"));

但是现在我收到了此消息。 找不到表格。

引起原因:com.google.api.client.googleapis.json.GoogleJsonResponseException:找不到404 {“代码”:404,“错误”:[{“域”:“全局”,“消息”:“未找到:表测试:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832“,”原因“:”未找到“}],”消息“:”未找到:表测试:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832“}

Google Cloud Platform中的所有资源,包括BigQuery表和Dataflow作业,都与一个云项目相关联。 与GCP资源互动时,必须指定项目。

异常跟踪表明没有为BigQueryIO.Read转换设置任何云项目: Caused by: java.lang.NullPointerException: Required parameter projectId must be specified

数据流通过其PipelineOptions API控制云项目的默认值。 数据流将默认使用所有API(包括BigQueryIO使用项目。

通常,我们建议使用PipelineOptionsFactory.fromArgs(String) API从命令行参数构造PipelineOptions 在这种情况下,您只需在命令行上传递--project=YOUR_PROJECT

或者,可以在代码中手动设置,如下所示:

GcpOptions gcpOptions = options.as(GcpOptions.class);
options.setProject("YOUR_PROJECT");

最后,从Java的Dataflow SDK版本1.4.0开始,Dataflow将默认使用通过gcloud config set project <project>的云项目。 您仍然可以通过PipelineOptions覆盖它,但不需要这样做。 即使在1.4.0之前的版本中,这在某些情况下也可能有效,但在所有情况下或Cloud SDK和Dataflow SDK版本的组合中可能都不可靠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM