#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 .. (только скопировав код и создав свой собственный трансформатор)