Как упоминалось выше, толпы можно легко создать с помощью портретных таблиц. В этой статье представлена еще одна форма организации данных, на которой основано создание толпы: BitMap тегов.
Логика использования портретных списков для группирования людей заключается в том, чтобы найти пользователей, которые соответствуют условиям, на основе подробных данных и, наконец, создать толпу. Использование BitMap для группирования людей будет предварительно агрегировать пользователей, а агрегированные результаты будут напрямую использоваться для расчетов при скоплении людей. выбор. Сначала все пользователи с указанным значением тега агрегируются для создания BitMap, а затем на основе этих BitMap выполняются операции пересечения, объединения и разности для реализации массового скрининга. На рис. 5-8 показана функциональная диаграмма выбора толпы на основе широкой таблицы и BitMap. Итоговая толпа, созданная этими двумя методами, одинакова.
Специальная структура данных BitMap определяет, что она подходит для агрегирования пользователей и применения в сценариях массового отбора. Нижний уровень BitMap создает битовый массив. Каждый бит может хранить только 1 или 0. Значение индекса массива сопоставляется с UserId. Когда число в текущем индексе равно 1, это означает, что соответствующий UserId существует. Если он равен 0, это означает, что UserId не существует. На рис. 5-9 показана базовая логика хранения UserId в BitMap. UserId больше не является конкретным числом, а сопоставляется со значением индекса битового массива. Благодаря этой функции обеспечивается сжатие, дедупликация, сортировка и хранение большого количества чисел UserId. может быть достигнуто.
Когда в BitMap записывается большое количество идентификаторов UserId, поскольку один и тот же UserId соответствует одной и той же позиции индекса, идентификатор UserId толпы может быть автоматически дедуплицирован; индекс битового массива естественным образом упорядочивается, и запись UserId толпы в BitMap может обеспечить удобную сортировку; Решение есть решение. Независимо от того, находится ли UserId в толпе, вы можете быстро определить, существует ли UserId, оценив, равно ли значение в указанной позиции индекса битового массива 1. Вышеуказанные характеристики BitMap очень подходят для хранения данных о толпе, что также определяет его широкое использование в портретных платформах.
BitMap может быть создан на основе таблицы данных тегов Hive. На рис. 5-10 показана принципиальная схема создания BitMap для тегов пола и провинции проживания. Во-первых, данные BitMap значения тега генерируются на основе агрегирования данных подробностей тега, а результат выполнения сохраняется в таблице Hive. Во-вторых, данные таблицы Hive сгенерированного значения тега BitMap записываются в таблицу ClickHouse. эффективность последующих запросов BitMap. Наконец, в процессе создания толпы BitMap запрашивается из таблицы данных и вычисляются данные толпы.
BitMap — это решение для отображения растровых изображений, и для инженерной разработки на языке Java можно использовать множество конкретных методов реализации. На рис. 5-11 показаны основные технологии, используемые в процессе создания таблицы BitMap с тегами из таблицы Hive с тегами. Различные ссылки включают преобразование различных форм данных BitMap.
Преобразование данных таблицы Hive в RoaringBitMap основано на наборе инструментов с открытым исходным кодом hive-bitmap-udf.jar. Функция UDF to_bitmap может преобразовать список UserId в объект RoaringBitMap и сохранить его в таблице Hive в двоичном формате. Инструментарий также содержит часто используемые функции UDF: bitmap_count, bitmap_and и bitmap_or и т. д., которые позволяют легко выполнять различные операции с BitMap. Данные BitMap в таблице Hive обрабатываются пакетно с помощью механизмов больших данных, таких как Spark, а затем записываются в таблицу ClickHouse. В ClickHouse нет двоичного типа данных. Двоичные данные в Hive обычно принимаются через строковый тип. Вы можете использовать функцию byteToString для преобразования растровых данных таблицы Hive в строковый тип. Принцип реализации заключается в преобразовании двоичных данных в byte[] и последующем кодировании их в строку с помощью BASE64. Растровые данные строкового типа считываются из ClickHouse, а преобразование из строки в RoaringBitMap можно осуществить с помощью функции bytesToBitMap. Несколько RoaringBitMap могут выполнять операции пересечения, объединения и разности непосредственно в памяти и, наконец, реализовывать создание толп.
Код SQL для генерации BitMap из данных таблицы Hive выглядит следующим образом. При внедрении набора инструментов и вызове в нем функции to_bitmap все идентификаторы пользователей под полом преобразуются в двоичный формат, и данные записываются в таблицу данных Hive.
-- Представляем набор инструментов UDF --
ADD JAR hdfs://userprofile-master:9000/hive-bitmap-udf.jar;
CREATE TEMPORARY FUNCTION to_bitmap AS 'com.hive.bitmap.udf.ToBitmapUDAF';
-- Запись данных в таблицу данных BitMap --
INSERT OVERWRITE TABLE userprofile_demo.gender_label_bitmap PARTITION(p_date = '2022-08-01')
SELECT
gender,
to_bitmap(user_id)
FROM
userprofile_demo.gender_label
WHERE
p_date = '2022-08-01'
GROUP BY
gender
Основной код преобразования между byte[], string и RoaringBitMap выглядит следующим образом. Благодаря гибкому использованию различных функций можно добиться преобразования типов данных между Hive и ClickHouse, хранилищем данных и памятью.
// Преобразовать массив байт-кода в строку
public static String bytesToString(byte[] bytes) throws IOException {
return Base64.getEncoder().encodeToString(bytes);
}
// Строка в массив байтов
public static byte[] stringToBytes(String str) throws IOException {
return Base64.getDecoder().decode(str);
}
// Байтовый массив в Roaring64Bitmap
public static Roaring64Bitmap bytesToBitMap(byte[] bytes) throws IOException {
Roaring64Bitmap bitmapValue = new Roaring64Bitmap();
DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
bitmapValue.deserialize(in);
in.close();
return bitmapValue;
}
// Roaring64Bitmap Преобразовать в массив байтов
public static byte[] bitMapToBytes(Roaring64Bitmap bitmap) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
bitmap.serialize(dos);
dos.close();
return bos.toByteArray();
}
Не все теги портретной ориентации подходят для преобразования в BitMap. Только теги с перечисляемыми значениями тегов и ограниченным числом подходят для преобразования в BitMap для поддержки массового выбора. Тег пола имеет три значения тега: мужской, женский и неизвестный. После создания BitMap вероятность использования каждого BitMap также высока, что больше подходит для создания тега BitMap. . Для числовых тегов, таких как продолжительность онлайна и количество поклонников, значения тегов невозможно перечислить, или их число огромно. Такие теги не подходят для построения BitMap. Создание BitMap требует большого количества вычислительных ресурсов и ресурсов хранения. Если разница в значениях меток невелика, вероятность использования сгенерированных данных BitMap мала, что является пустой тратой вычислительных ресурсов и ресурсов хранения.
Использовать ли портретную широкую таблицу или BitMap, зависит от особенностей бизнеса. Все функции выбора толпы могут быть реализованы на основе подробных данных всех пользователей в широкой таблице, но скорость создания толпы с помощью решения BitMap может быть увеличена более чем на 50% по сравнению с режимом широкой таблицы. Применимые типы тегов и бизнес-сценарии BitMap ограничены, и решения должны приниматься на основе фактических данных. В отрасли обычно используется гибридная модель, отдающая приоритет созданию толпы с помощью BitMap. В неподходящих сценариях для отбора толпы используются портретные широкие таблицы. При использовании смешанного режима необходимо учитывать выравнивание таблицы ширины портрета и времени метки BitMap, что увеличивает сложность реализации проекта.
Эта статья взята из книги «Портреты пользователей: построение платформ и бизнес-практика». При перепечатке указывайте источник.