从Bigquery导出到存储

时间:2017-01-05 00:15:23

标签: google-bigquery google-cloud-storage google-cloud-dataflow

将数据从BigQuery导出到Google存储的最佳方法是什么。注意,我需要针对Bigquery运行查询,而不是导出所有数据。基本上,我需要针对BigQuery运行自定义查询(例如select * from mytable where code=foo),并且查询结果需要写入存储在Google Cloud上的csv。 我相信,最好的方法是通过谷歌数据流。如果还有其他选择,请告诉我? 另外,我正在寻找一些如何实现这一目标的示例。有什么地方我可以找到一些例子吗?

这是我到目前为止所拥有的     PipelineOptions pipelineOptions = PipelineOptionsFactory.create();         管道p = Pipeline.create(pipelineOptions);

    Date date = new Date();

    p.getOptions().setTempLocation("gs://mybucket/tmp"+date.getTime());

    PCollection<TableRow> rowPCollection = p.apply(BigQueryIO.Read.named("promos")
            .fromQuery("SELECT * FROM [projectid:mydataset.mytable] where id = 256 LIMIT 1000"));

    PCollection<String> stringPCollection = rowPCollection.apply(ParDo.named("Extract").of(new DoFn<TableRow, String>() {
        @Override
        public void processElement(ProcessContext c) {
            TableRow tableRow = c.element();
            try {
                String prettyString = tableRow.toPrettyString();
                c.output(prettyString);
            } catch (IOException e) {
                log.error("Exception occurred:" + e.getMessage());
            }
        }
    }));

    stringPCollection.apply(TextIO.Write.named("WriteOutput").to("gs://mybucket/avexport").withSuffix(".csv"));

    p.run();

此次运行时,会在创建ParDo时抛出异常

caused by: java.io.NotSerializableException: com.my.validation.CommonValidator
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.google.cloud.dataflow.sdk.util.SerializableUtils.serializeToByteArray(SerializableUtils.java:50)

2 个答案:

答案 0 :(得分:1)

我猜你的匿名DoFn正在从无法序列化的封闭类(CommonValidator)中引入一些东西。如果为DoFn实现创建静态类,是否可以解决问题?

有关详细信息,请参阅NotSerializableException on anonymous class

答案 1 :(得分:0)

除了错误之外,您不必使用Dataflow将BigQuery数据导出到GCS,除非您在Dataflow管道中进行一些复杂的转换(无论如何,您几乎肯定会在SQL / UDF中执行此操作,但是我离题了。从您的代码段和说明中,您似乎无法对数据进行任何类型的转换。

你可以:

  1. 运行SQL并将结果保存到BigQuery表。
  2. 按照here所述将表格导出到GCS。