Перейти к основному содержимому

Hive Bitmap UDF

Hive Bitmap UDF предоставляет UDF-функции, которые можно напрямую использовать в Hive. Они могут применяться для генерации данных Bitmap и выполнения связанных с Bitmap вычислений.

Формат Bitmap, определенный в Hive Bitmap UDF, согласован с форматом в Selena и может напрямую использоваться для загрузки данных Bitmap в Selena и выгрузки данных Bitmap из Selena в Hive.

Применимые сценарии:

  • Объем исходных данных велик, и прямая загрузка этих данных в Selena для вычислений создаст огромную нагрузку на кластеры Selena. Желаемое решение — генерация данных Bitmap в Hive с последующей загрузкой Bitmap в Selena.
  • Экспорт данных Bitmap, сгенерированных в Selena, в Hive для использования другими системами.

Поддерживаемые типы исходных и целевых данных:

  • v3.1 и более поздние версии поддерживают загрузку и выгрузку данных следующих типов: String, Base64 и Binary.
  • v2.5 и v3.0 поддерживают только загрузку и выгрузку данных String и Base64.

Hive Bitmap UDF-функции, которые можно сгенерировать

  • com.starrocks.hive.udf.UDAFBitmapAgg

    Объединяет несколько строк не-null значений в столбце в одну строку значений Bitmap, что эквивалентно встроенной агрегатной функции Selena bitmap_agg.

  • com.starrocks.hive.udf.UDAFBitmapUnion

    Вычисляет объединение набора bitmap-ов, что эквивалентно встроенной агрегатной функции Selena bitmap_union.

  • com.starrocks.hive.udf.UDFBase64ToBitmap

    Преобразует строку в кодировке base64 в bitmap, что эквивалентно встроенной функции Selena base64_to_bitmap.

  • com.starrocks.hive.udf.UDFBitmapAnd

    Вычисляет пересечение двух bitmap-ов, что эквивалентно встроенной функции Selena bitmap_and.

  • com.starrocks.hive.udf.UDFBitmapCount

    Подсчитывает количество значений в bitmap, что эквивалентно встроенной функции Selena bitmap_count.

  • com.starrocks.hive.udf.UDFBitmapFromString

    Преобразует строку, разделенную запятыми, в bitmap, что эквивалентно встроенной функции Selena bitmap_from_string.

  • com.starrocks.hive.udf.UDFBitmapOr

    Вычисляет объединение двух bitmap-ов, что эквивалентно встроенной функции Selena bitmap_or.

  • com.starrocks.hive.udf.UDFBitmapToBase64

    Преобразует Bitmap в строку Base64, что эквивалентно встроенной функции Selena bitmap_to_base64.

  • com.starrocks.hive.udf.UDFBitmapToString

    Преобразует bitmap в строку, разделенную запятыми, что эквивалентно встроенной функции Selena bitmap_to_string.

  • com.starrocks.hive.udf.UDFBitmapXor

    Вычисляет набор уникальных элементов в двух Bitmap-ах, что эквивалентно встроенной функции Selena bitmap_xor.

Как использовать

  1. Скомпилируйте и сгенерируйте Hive UDF на FE.

    ./build.sh --hive-udf

    JAR-пакет hive-udf-1.0.0.jar будет сгенерирован в директории fe/hive-udf/.

  2. Загрузите JAR-пакет в HDFS.

    hadoop  fs -put -f ./hive-udf-1.0.0.jar hdfs://<hdfs_ip>:<hdfs_port>/hive-udf-1.0.0.jar
  3. Загрузите JAR-пакет в Hive.

    hive> add jar hdfs://<hdfs_ip>:<hdfs_port>/hive-udf-1.0.0.jar;
  4. Загрузите UDF-функции.

    hive> create temporary function bitmap_agg as 'com.starrocks.hive.udf.UDAFBitmapAgg';
    hive> create temporary function bitmap_union as 'com.starrocks.hive.udf.UDAFBitmapUnion';
    hive> create temporary function base64_to_bitmap as 'com.starrocks.hive.udf.UDFBase64ToBitmap';
    hive> create temporary function bitmap_and as 'com.starrocks.hive.udf.UDFBitmapAnd';
    hive> create temporary function bitmap_count as 'com.starrocks.hive.udf.UDFBitmapCount';
    hive> create temporary function bitmap_from_string as 'com.starrocks.hive.udf.UDFBitmapFromString';
    hive> create temporary function bitmap_or as 'com.starrocks.hive.udf.UDFBitmapOr';
    hive> create temporary function bitmap_to_base64 as 'com.starrocks.hive.udf.UDFBitmapToBase64';
    hive> create temporary function bitmap_to_string as 'com.starrocks.hive.udf.UDFBitmapToString';
    hive> create temporary function bitmap_xor as 'com.starrocks.hive.udf.UDFBitmapXor';

Примеры использования

Генерация Bitmap в Hive и загрузка в Selena в формате Binary

  1. Создайте исходную таблицу Hive.

    hive> create table t_src(c1 bigint, c2 bigint) stored as parquet;

    hive> insert into t_src values (1,1), (1,2), (1,3), (2,4), (2,5);

    hive> select * from t_src;
    1 1
    1 2
    1 3
    2 4
    2 5
  2. Создайте таблицу bitmap в Hive.

    hive> create table t_bitmap(c1 bigint, c2 binary) stored as parquet;

    Hive генерирует bitmap через UDFBitmapAgg и записывает его в таблицу bitmap.

    hive> insert into t_bitmap select c1, bitmap_agg(c2) from t_src group by c1;
  3. Создайте таблицу Bitmap в Selena.

    mysql> create table t1(c1 int, c2 bitmap bitmap_union) aggregate key(c1)  distributed by hash(c1);
  4. Загрузите данные Bitmap в Selena различными способами.

    • Загрузите данные через функцию files.
    mysql> insert into t1 select c1, bitmap_from_binary(c2) from files (
    "path" = "hdfs://<hdfs_ip>:<hdfs_port>/<hdfs_db>/t_bitmap/*",
    "format"="parquet",
    "compression" = "uncompressed"
    );
    mysql> insert into t1 select c1, bitmap_from_binary(c2) from hive_catalog_hms.xxx_db.t_bitmap;
  5. Просмотрите результаты.

    mysql> select c1, bitmap_to_string(c2) from t1;                                                                                                                                                                                                                                   
    +------+----------------------+
    | c1 | bitmap_to_string(c2) |
    +------+----------------------+
    | 1 | 1,2,3 |
    | 2 | 4,5 |
    +------+----------------------+

Экспорт Bitmap из Selena в Hive

  1. Создайте таблицу Bitmap в Selena и запишите данные в эту таблицу.

    mysql> create table t1(c1 int, c2 bitmap bitmap_union) aggregate key(c1) buckets 3 distributed by hash(c1);

    mysql> select c1, bitmap_to_string(c2) from t1;
    +------+----------------------+
    | c1 | bitmap_to_string(c2) |
    +------+----------------------+
    | 1 | 1,2,3 |
    | 2 | 4,5 |
    +------+----------------------+
  2. Создайте таблицу Bitmap в Hive.

    hive> create table t_bitmap(c1 bigint, c2 binary) stored as parquet;
  3. Экспортируйте данные различными способами.

    • Экспортируйте данные через INSERT INTO FILES (формат Binary).
    mysql> insert into files (
    "path" = "hdfs://<hdfs_ip>:<hdfs_port>/<hdfs_db>/t_bitmap/",
    "format"="parquet",
    "compression" = "uncompressed"
    ) select c1, bitmap_to_binary(c2) as c2 from t1;
    • Экспортируйте данные через Hive Catalog (формат Binary).
    mysql> insert into hive_catalog_hms.<hdfs_db>.t_bitmap select c1, bitmap_to_binary(c2) from t1;
  4. Просмотрите результаты в Hive.

    hive> select c1, bitmap_to_string(c2) from t_bitmap;
    1 1,2,3
    2 4,5