从Google Cloud BigQuery中读取数据

时间:2016-01-20 07:16:18

标签: java google-app-engine google-bigquery google-cloud-dataflow dataflow

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

错误:

  

线程中的异常&#34; main&#34; java.lang.IllegalArgumentException异常:   验证查询&#34; SELECT * FROM DataSetTest.data&#34;失败。如果   查询取决于管道的早期阶段,此验证可以   使用#withoutValidation禁用。

     

在   com.google.cloud.dataflow.sdk.io.BigQueryIO $ $读Bound.dryRunQuery(BigQueryIO.java:449)

     

在   com.google.cloud.dataflow.sdk.io.BigQueryIO $ $读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 $ $作业查询。(Bigquery.java:1751)

     

在   com.google.api.services.bigquery.Bigquery $ Jobs.query(Bigquery.java:1724)

     

在   com.google.cloud.dataflow.sdk.io.BigQueryIO $ $读Bound.dryRunQuery(BigQueryIO.java:445)

     

... 6更多

这里有什么问题?

更新:

我通过&#34; options.setProject&#34;。

设置项目
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   {     &#34;代码&#34; :404,     &#34;错误&#34; :[{       &#34;结构域&#34; :&#34;全球&#34;,       &#34;消息&#34; :&#34;未找到:表测试:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832&#34;,       &#34;理由&#34; :&#34; notFound&#34;     }],     &#34;消息&#34; :&#34;未找到:表测试:_dataflow_temporary_dataset_737099.dataflow_temporary_table_550832&#34;   }

1 个答案:

答案 0 :(得分:4)

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

通常,我们建议使用PipelineOptions API从命令行参数构造PipelineOptionsFactory.fromArgs(String)。在这种情况下,您只需在命令行上传递--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>设置的云项目。您仍然可以通过PipelineOptions覆盖它,但不需要。这可能在版本1.4.0之前的某些情况下有效,但在所有方案或Cloud SDK和Dataflow SDK版本的组合中可能都不可靠。