从Google Cloud BigQuery中读取数据

问题描述:

我是管道世界和Google API DataFlow的新手。从Google Cloud BigQuery中读取数据

我想用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")); 

错误:

Exception in thread "main" java.lang.IllegalArgumentException: Validation of query "SELECT * FROM DataSetTest.data" failed. If the query depends on an earlier stage of the pipeline, This validation can be disabled using #withoutValidation.

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

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

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

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

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

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

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

Caused by: java.lang.NullPointerException: Required parameter projectId must be specified.

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

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

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

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

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

... 6 more

这里有什么问题?

更新:

我通过“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")); 

但是现在我收到了这条消息。表未找到。

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found { "code" : 404, "errors" : [ { "domain" : "global", "message" : "Not found: Table test:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832", "reason" : "notFound" } ], "message" : "Not found: Table test:_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

Dataflow通过其PipelineOptions API控制云项目的默认值。 Dataflow将默认使用跨项目API的项目,包括BigQueryIO

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

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

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

最后,从数据流的Java SDK 1.4.0版本中,数据流将默认使用云计算项目集通过gcloud config set project <project>。你仍然可以通过PipelineOptions覆盖它,但不需要。这可能在1.4.0版之前的某些情况下有效,但在所有场景或Cloud SDK和Dataflow SDK版本的组合中可能都不可靠。

+0

我已经使用Google Cloud SDK指定了项目。 – Jan

+0

不幸的是,Google Cloud SDK更改了其填充项目ID的位置。因此,有一个场景以及Cloud SDK和Dataflow SDK版本的组合,其中这些SDK可能不会自动填充。这应该在数据流SDK版本1.4.0及更高版本中得到解决,该版本将在几天内发布。同时,请指定'--project''PipelineOption'。 –

+0

我是否需要一个存储桶来访问GC BigQuery中的数据? – Jan