首页 文章

从Google Cloud BigQuery读取数据

提问于
浏览
1

我是Pipeline world和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"));

错误:

线程“main”中的异常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)位于test.java.packageid.StarterPipeline.main的com.google.cloud.dataflow.sdk.Pipeline.apply(Pipeline.java:151) (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的com.google.api.services.bigquery.Bigquery $ Jobs.query(Bigquery.java:1724) . 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 Not Found {“code”:404,“errors”:[{“domain”:“global”,“message”:“未找到:表测试:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832“,”reason“:”notFound“}],”message“:”未找到:表测试:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832“}

1 回答

  • 4

    Google Cloud Platform中的所有资源(包括BigQuery表和Dataflow作业)都与 Cloud 项目相关联 . 在与GCP资源交互时,必须指定项目 .

    异常跟踪表示没有为 BigQueryIO.Read 转换设置 Cloud 项目: Caused by: java.lang.NullPointerException: Required parameter projectId must be specified .

    Dataflow通过其 PipelineOptions API控制 Cloud 项目的默认值 . Dataflow将默认在其API中使用项目,包括 BigQueryIO .

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

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

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

    最后,从Dataflow SDK for Java 1.4.0版开始,Dataflow将默认使用通过 gcloud config set project <project> 设置的 Cloud 项目 . 您仍然可以通过 PipelineOptions 覆盖它,但不需要 . 在版本1.4.0之前,这可能在某些情况下有效,但在所有方案或Cloud SDK和Dataflow SDK版本的组合中可能都不可靠 .

相关问题