从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版本的组合中可能都不可靠。
我已经使用Google Cloud SDK指定了项目。 – Jan
不幸的是,Google Cloud SDK更改了其填充项目ID的位置。因此,有一个场景以及Cloud SDK和Dataflow SDK版本的组合,其中这些SDK可能不会自动填充。这应该在数据流SDK版本1.4.0及更高版本中得到解决,该版本将在几天内发布。同时,请指定'--project''PipelineOption'。 –
我是否需要一个存储桶来访问GC BigQuery中的数据? – Jan