簡體   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