将BigQuery表流式传输到Google Pub / Sub

时间:2016-12-25 14:31:01

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

我有一个Google bigQuery表,我希望将整个表流式传输到pub-sub主题

什么应该是简单/快速的方法呢?

提前谢谢你,

2 个答案:

答案 0 :(得分:6)

2019更新:

现在通过Pub / Sub中的click-to-bigquery选项非常简单:

enter image description here

https://console.cloud.google.com/cloudpubsub/topicList

上找到它

我所知道的最简单的方法是通过Google Cloud Dataflow,它本身知道如何访问BigQuery和Pub / Sub。

理论上它应该像以下Python行一样简单:

p = beam.Pipeline(options=pipeline_options)
tablerows = p | 'read' >> beam.io.Read(
  beam.io.BigQuerySource('clouddataflow-readonly:samples.weather_stations'))
tablerows | 'write' >> beam.io.Write(
  beam.io.PubSubSink('projects/fh-dataflow/topics/bq2pubsub-topic'))

Python / Dataflow / BigQuery / PubSub的这种组合今天不起作用(Python数据流处于测试阶段,但是keep an eye on the changelog)。

我们可以用Java做同样的事情,并且效果很好 - 我只是测试了它。它在本地运行,也在托管的Dataflow运行器中运行:

Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args).withValidation().create());

PCollection<TableRow> weatherData = p.apply(
        BigQueryIO.Read.named("ReadWeatherStations").from("clouddataflow-readonly:samples.weather_stations"));
weatherData.apply(ParDo.named("tableRow2string").of(new DoFn<TableRow, String>() {
    @Override
    public void processElement(DoFn<TableRow, String>.ProcessContext c) throws Exception {
        c.output(c.element().toString());
    }
})).apply(PubsubIO.Write.named("WriteToPubsub").topic("projects/myproject/topics/bq2pubsub-topic"));

p.run();

测试消息是否包含:

gcloud --project myproject beta pubsub subscriptions  pull --auto-ack sub1

托管数据流屏幕截图:

Hosted Dataflow at work

答案 1 :(得分:2)

这实际上取决于桌子的大小。

如果它是一个小表(几千个记录,一对打瞌睡的列),那么你可以设置一个进程来查询整个表,将响应转换为JSON数组,然后推送到pub-sub。 / p>

如果它是一张大表(数百万/十亿条记录,数百列),您必须导出到文件,然后准备/运送到pub-sub

这还取决于您的分区策略 - 如果您的表设置为按日期分区,您可以再次查询而不是导出。

最后但并非最不重要的是,它还取决于频率 - 这是一次性交易(然后是导出)还是连续过程(然后使用表装饰器来查询最新数据)?

如果您想要一个真正有用的答案,还需要更多信息。

修改

根据您对表格大小的评论,我认为最好的方法是制作一个脚本:

  1. 将表格导出为GCS作为换行符分隔JSON

  2. 处理文件(逐行阅读)并发送到pub-sub

  3. 大多数编程语言都有client libraries。我已经用Python完成了类似的事情,并且相当直接。