我需要将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
也不适合合并。
答案 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中预先计算的草图,从而可以交互速度提取结果。