将数据从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)
答案 0 :(得分:1)
我猜你的匿名DoFn正在从无法序列化的封闭类(CommonValidator)中引入一些东西。如果为DoFn实现创建静态类,是否可以解决问题?
有关详细信息,请参阅NotSerializableException on anonymous class。
答案 1 :(得分:0)
除了错误之外,您不必使用Dataflow将BigQuery数据导出到GCS,除非您在Dataflow管道中进行一些复杂的转换(无论如何,您几乎肯定会在SQL / UDF中执行此操作,但是我离题了。从您的代码段和说明中,您似乎无法对数据进行任何类型的转换。
你可以: