如何使用Data FlowRunner从ApacheBeam将hyperLogLog字段保存到BigQuery

时间:2019-04-04 15:27:28

标签: java google-bigquery google-cloud-dataflow apache-beam hyperloglog

我需要将HLL草图从ApacheBeam保存到BigQuery中。

我找到了适用于Apache-Beam的扩展名library

但是我找不到将草图本身保存到BigQuery的方法。以便稍后将其与合并功能和其他功能结合使用:请参阅此link

我的代码:

 .apply("hll-count",  Combine.perKey(ApproximateDistinct.ApproximateDistinctFn
                            .create(StringUtf8Coder.of())))
.apply("reify-windows", Reify.windows())
                    .apply("to-table-row", ParDo.of(new DoFn< ValueInSingleWindow<KV<GroupByData,HyperLogLogPlus>>, TableRow>() {
                        @ProcessElement
                        public void processElement(ProcessContext processContext) {
                            ValueInSingleWindow<KV<GroupByData,HyperLogLogPlus>> windowed = processContext.element();
                            KV<GroupByData, HyperLogLogPlus> keyData = windowed.getValue();
                            GroupByData key = keyData.getKey();

                            HyperLogLogPlus hyperLogLogPlus = keyData.getValue();
                            if (key != null) {

                                TableRow tableRow = new TableRow();
                                tableRow.set("country_code",key.countryCode);
                                tableRow.set("event", key.event);
                                tableRow.set("profile", key.profile);

                                 tableRow.set("occurrences", hyperLogLogPlus.cardinality());

我刚刚找到了如何做hyperLogLogPlus.cardinality(),但是如何在BiGQuery中写缓冲区本身,以便以后可以在其合并功能上运行。

使用hyperLogLogPlus.getBytes也不适合合并。

2 个答案:

答案 0 :(得分:2)

当前,Apache Beam不支持此功能,但是有人在使用它。

具体来说: 您提到的Apache Beam中的extension library取决于this HyperLogLog的实现。该库生成的草图与Google Cloud BigQuery计算的sketches不一致。因此在BigQuery中合并草图没有任何意义。

答案 1 :(得分:1)

自此问题于2019年4月首次提出以来,已发布了BigQuery兼容的HLL草图实现,如本GCP博客文章Using HLL++ to speed up count-distinct in massive datasets所述。

该帖子具有说明性代码段,显示了如何将HLL草图保存到BigQuery和GCS文件中。

引用帖子的相关部分:

  

[HyperLogLog的Google实现]已于2017年添加到BigQuery中,并且最近已开源并从2.16版开始在Apache Beam中直接可用。这意味着它可以在Cloud Dataflow中使用...

     

注意:从版本2.16开始,有几种近似计数算法的实现。我们建议使用HllCount.java,尤其是在您需要草图和/或与Google Cloud BigQuery兼容的情况下。

帖子3部分中的“在BigQuery中存储草图”:

  

BigQuery通过HLL_COUNT函数支持HLL ++,并且BigQuery的草图与Beam的草图完全兼容,因此可以轻松地在两个系统中与草图对象进行互操作。

     

在下面的示例中,我们将:   1.将数据预先汇总到Beam中的草图中;   2.将草图与字节有关时间间隔的元数据一起存储在BigQuery中,作为byte []列;   3.在BigQuery中运行汇总查询,这要归功于Beam中预先计算的草图,从而可以交互速度提取结果。