![](/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.