Как сохранить поле HyperLogLog в BigQuery из ApacheBeam с помощью программы запуска потока данных

#java #google-bigquery #google-cloud-dataflow #apache-beam #hyperloglog

#java #google-bigquery #google-облако-поток данных #apache-beam #hyperloglog

Вопрос:

Мне нужно сохранить эскизы HLL в BigQuery из ApacheBeam.

Я нашел некоторую библиотеку расширений для 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 также не сработало для слияния.

Комментарии:

1. Похоже, что Apache Beam работает над этим: issuetracker.google.com/issues/123269269#comment5 и здесь issues.apache.org/jira/browse /…

2. Обновление: совместимая с BigQuery реализация HyperLogLog была открыта для github.com/google/zetasketch и документ по дизайну ( docs.google.com/document/d /… ) информация об интеграции в Apache Beam была отправлена на dev@beam.apache.org .

Ответ №1:

В настоящее время эта функциональность не поддерживается Apache Beam, но есть люди, работающие над этим.

Если быть точным: библиотека расширений в Apache Beam, о которой вы упомянули, зависит от этой реализации HyperLogLog. Эскизы, созданные этой библиотекой, не соответствуют эскизам, вычисленным Google Cloud BigQuery. Поэтому не имело бы смысла объединять эскизы в BigQuery.

Ответ №2:

Поскольку этот вопрос был впервые задан в апреле 2019 года, была выпущена совместимая с BigQuery реализация HLL sketch, как отмечено в этом сообщении в блоге GCP, использующая HLL для ускорения подсчета в массивных наборах данных.

В сообщении есть иллюстративные фрагменты кода, показывающие, как сохранить эскизы HLL в BigQuery, а также в файлы GCS.

Цитируя соответствующие части сообщения:

[Реализация HyperLogLog от Google] была добавлена в BigQuery в 2017 году и недавно была открыта с открытым исходным кодом и стала доступна непосредственно в Apache Beam начиная с версии 2.16. Это означает, что оно доступно для использования в облачном потоке данных…

Примечание: Начиная с версии 2.16, существует несколько реализаций алгоритмов приблизительного подсчета. Мы рекомендуем использовать HllCount.java , особенно если вам нужны эскизы и / или требуется совместимость с Google Cloud BigQuery.

Из раздела 3 сообщения «Сохранение эскизов в BigQuery»:

BigQuery поддерживает HLL через функции HLL_COUNT, а эскизы BigQuery полностью совместимы с Beam, поэтому легко взаимодействовать с объектами sketch в обеих системах.

В примере ниже мы будем: 1. Предварительно объедините данные в эскизы в Beam; 2. Сохраните эскизы в BigQuery в виде столбцов byte[] вместе с некоторыми метаданными об интервале времени; 3. Запустите сводный запрос в BigQuery, который может извлекать результаты с интерактивной скоростью, благодаря эскизам, которые были предварительно вычислены в Beam.

Комментарии:

1. я не вижу, как использовать его в beam sql .. (только скопировав код и создав свой собственный трансформатор)