Основа для создания толпы: портретный тег BitMap
Основа для создания толпы: портретный тег BitMap

Как упоминалось выше, толпы можно легко создать с помощью портретных таблиц. В этой статье представлена ​​еще одна форма организации данных, на которой основано создание толпы: BitMap тегов.

Логика использования портретных списков для группирования людей заключается в том, чтобы найти пользователей, которые соответствуют условиям, на основе подробных данных и, наконец, создать толпу. Использование BitMap для группирования людей будет предварительно агрегировать пользователей, а агрегированные результаты будут напрямую использоваться для расчетов при скоплении людей. выбор. Сначала все пользователи с указанным значением тега агрегируются для создания BitMap, а затем на основе этих BitMap выполняются операции пересечения, объединения и разности для реализации массового скрининга. На рис. 5-8 показана функциональная диаграмма выбора толпы на основе широкой таблицы и BitMap. Итоговая толпа, созданная этими двумя методами, одинакова.

Рисунок 5-8 Схематическая диаграмма отбора толпы с использованием широкой таблицы и BitMap.
Рисунок 5-8 Схематическая диаграмма отбора толпы с использованием широкой таблицы и BitMap.

Специальная структура данных BitMap определяет, что она подходит для агрегирования пользователей и применения в сценариях массового отбора. Нижний уровень BitMap создает битовый массив. Каждый бит может хранить только 1 или 0. Значение индекса массива сопоставляется с UserId. Когда число в текущем индексе равно 1, это означает, что соответствующий UserId существует. Если он равен 0, это означает, что UserId не существует. На рис. 5-9 показана базовая логика хранения UserId в BitMap. UserId больше не является конкретным числом, а сопоставляется со значением индекса битового массива. Благодаря этой функции обеспечивается сжатие, дедупликация, сортировка и хранение большого количества чисел UserId. может быть достигнуто.

Рис. 5-9. Основной принцип хранения UserId в BitMap.
Рис. 5-9. Основной принцип хранения UserId в BitMap.

Когда в BitMap записывается большое количество идентификаторов UserId, поскольку один и тот же UserId соответствует одной и той же позиции индекса, идентификатор UserId толпы может быть автоматически дедуплицирован; индекс битового массива естественным образом упорядочивается, и запись UserId толпы в BitMap может обеспечить удобную сортировку; Решение есть решение. Независимо от того, находится ли UserId в толпе, вы можете быстро определить, существует ли UserId, оценив, равно ли значение в указанной позиции индекса битового массива 1. Вышеуказанные характеристики BitMap очень подходят для хранения данных о толпе, что также определяет его широкое использование в портретных платформах.

BitMap может быть создан на основе таблицы данных тегов Hive. На рис. 5-10 показана принципиальная схема создания BitMap для тегов пола и провинции проживания. Во-первых, данные BitMap значения тега генерируются на основе агрегирования данных подробностей тега, а результат выполнения сохраняется в таблице Hive. Во-вторых, данные таблицы Hive сгенерированного значения тега BitMap записываются в таблицу ClickHouse. эффективность последующих запросов BitMap. Наконец, в процессе создания толпы BitMap запрашивается из таблицы данных и вычисляются данные толпы.

Рисунок 5-10 По тегу Генерация данных таблицы Hive BitMap
Рисунок 5-10 По тегу Генерация данных таблицы Hive BitMap

BitMap — это решение для отображения растровых изображений, и для инженерной разработки на языке Java можно использовать множество конкретных методов реализации. На рис. 5-11 показаны основные технологии, используемые в процессе создания таблицы BitMap с тегами из таблицы Hive с тегами. Различные ссылки включают преобразование различных форм данных BitMap.

Рисунок 5-11 Блок-схема создания растрового изображения метки
Рисунок 5-11 Блок-схема создания растрового изображения метки

Преобразование данных таблицы 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.

Язык кода:javascript
копировать
-- Представляем набор инструментов 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, хранилищем данных и памятью.

Язык кода:javascript
копировать
// Преобразовать массив байт-кода в строку
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, что увеличивает сложность реализации проекта.


Эта статья взята из книги «Портреты пользователей: построение платформ и бизнес-практика». При перепечатке указывайте источник.

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода