0

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

我找到了一些用于 Apache-Beam 的扩展

但我找不到将草图本身保存到 BigQuery 的方法。以后可以通过一段时间滑动将其与合并功能和其他功能一起使用:请参阅此链接

我的代码:

 .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也不适用于合并。

4

2 回答 2

2

目前 Apache Beam 不支持此功能,但有人正在研究它。

具体来说:您提到的 Apache Beam 中的扩展库依赖于这个HyperLogLog 实现。该库生成的草图与Google Cloud BigQuery 计算的草图不一致。所以在 BigQuery 中合并草图是没有意义的。

于 2019-04-04T20:50:13.243 回答
1

自从这个问题在 2019 年 4 月首次提出以来,HLL 草图的 BigQuery 兼容实现已经发布,正如这篇 GCP 博客文章中所述,使用 HLL++ 加速海量数据集中的计数不同

这篇文章有说明性的代码片段,展示了如何将 HLL 草图保存到 BigQuery 以及 GCS 文件。

引用帖子的相关部分:

[HyperLogLog 的 Google 实现] 于 2017 年添加到 BigQuery,最近已开源并在 Apache Beam 2.16 版本中直接可用。这意味着它可用于 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 中预先计算的草图。

于 2019-12-27T22:27:53.933 回答