![](/img/trans.png)
[英]Read the data from Google Cloud Sql to BigQuery using Clud Dataflow
[英]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.