怎么使用 Flink 向 Apache Doris 表中寫 Bitmap 類型的數(shù)據(jù)

Bitmap是一種經(jīng)典的數(shù)據(jù)結(jié)構(gòu)秃诵,用于高效地對大量的二進制數(shù)據(jù)進行壓縮存儲和快速查詢庞瘸。Doris支持bitmap數(shù)據(jù)類型焰薄,在Flink計算場景中槽卫,可以結(jié)合Flink doris Connector對bitmap數(shù)據(jù)做計算跟压。

社區(qū)里很多小伙伴在是Doris Flink Connector的時候,不知道怎么寫B(tài)itmap類型的數(shù)據(jù)晒夹,本文將介紹如何使用 Flink Doris Connector 如何將 bitmap 數(shù)據(jù)寫入 Doris 中裆馒。

前置準備
Doris2.0.1的環(huán)境

Flink1.16姊氓,同時將 Doris Flink Connector的Jar包放在<FLINK_HOME>/lib 下面丐怯。

創(chuàng)建Doris表

CREATE TABLE `page_view_bitmap` (
`dt` int,
`page` varchar(256),
`user_id` bitmap bitmap_union
)
AGGREGATE KEY(`dt`, page)
DISTRIBUTED BY HASH(`dt`) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
)

寫入Bitmap數(shù)據(jù)
這里模擬Flink讀取MySQL數(shù)據(jù)寫入Doris,同時將user_id存儲到bitmap中翔横。

模擬數(shù)據(jù)

創(chuàng)建MySQL表

CREATE TABLE `page_view` (
 `id` int NOT NULL,
 `dt` int,
 `page` varchar(256),
 `user_id` int,
 PRIMARY KEY (`id`)
);

#模擬數(shù)據(jù)
INSERT INTO `test`.`page_view` (`id`, `dt`, `page`, `user_id`) VALUES (1, 20230921, 'home', 1001);
INSERT INTO `test`.`page_view` (`id`, `dt`, `page`, `user_id`) VALUES (2, 20230921, 'home', 1002);
INSERT INTO `test`.`page_view` (`id`, `dt`, `page`, `user_id`) VALUES (3, 20230921, 'search', 1003);
INSERT INTO `test`.`page_view` (`id`, `dt`, `page`, `user_id`) VALUES (4, 20230922, 'mine', 1001);
INSERT INTO `test`.`page_view` (`id`, `dt`, `page`, `user_id`) VALUES (5, 20230922, 'home', 1002);
FlinkSQL寫入Bitmap
#使用JDBC讀取mysql數(shù)據(jù)
CREATE TABLE page_view (
   `dt` int,
   `page` string,
   `user_id` int
) WITH (
   'connector' = 'jdbc',
   'url' = 'jdbc:mysql://127.0.0.1:3306/test',
   'table-name' = 'page_view',
   'username' = 'root',
   'password' = '123456'
);

doris connector寫入數(shù)據(jù)

CREATE TABLE page_view_bitmap (
dt int,
page string,
user_id int
)
WITH (
 'connector' = 'doris',
 'fenodes' = '127.0.0.1:8030',
 'table.identifier' = 'test.page_view_bitmap',
 'username' = 'root',
 'password' = '',
 'sink.label-prefix' = 'doris_label1',
 'sink.properties.columns' = 'dt,page,user_id,user_id=to_bitmap(user_id)'
);

insert into page_view_bitmap select * from page_view
我們知道 Doris Flink Connector Sink 底層是基于 Doris Stream Load 來實現(xiàn)的读跷,同樣 Stream load 在 Connector 里也是一樣適用,我們將這個參數(shù)封裝在了 :sink.properties 參數(shù)里禾唁,
這里我們可以看到上面這個例子里我們在是 With 屬性里加入了我們 Columns 參數(shù)效览,這里我們配置了列的轉(zhuǎn)換操作,將 user_id 通過 to_bitmap 函數(shù)進行轉(zhuǎn)換荡短,并導入到 Doris 表里丐枉。
查詢結(jié)果

mysql> select dt,page,bitmap_to_string(user_id) from `test`.`page_view_bitmap`;
+----------+--------+---------------------------+
| dt       | page   | bitmap_to_string(user_id) |
+----------+--------+---------------------------+
| 20230921 | home   | 1001,1002                 |
| 20230921 | search | 1003                      |
| 20230922 | home   | 1002                      |
| 20230922 | mine   | 1001                      |
+----------+--------+---------------------------+
4 rows in set (0.00 sec)

Flink DataStream
使用 DataStream API 模擬數(shù)據(jù)寫入剛才的表中。

DataStream API 對 Bitmap 的操作也是和上面 SQL 操作的方式一樣掘托。

public static void main(String[] args) throws Exception {
       StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
       env.setParallelism(1);
       env.setRuntimeMode(RuntimeExecutionMode.BATCH);

       DorisSink.Builder<String> builder = DorisSink.builder();
       final DorisReadOptions.Builder readOptionBuilder = DorisReadOptions.builder();
       Properties properties = new Properties();
       properties.setProperty("column_separator", ",");
       properties.setProperty("format", "csv");
       properties.setProperty("columns", "dt,page,user_id,user_id=to_bitmap(user_id)");

       DorisOptions.Builder dorisBuilder = DorisOptions.builder();
       dorisBuilder.setFenodes("127.0.0.1:8030")
              .setTableIdentifier("test.page_view_bitmap")
              .setUsername("root")
              .setPassword("");
       DorisExecutionOptions.Builder executionBuilder = DorisExecutionOptions.builder();
       executionBuilder.setLabelPrefix("doris_label")
              .setStreamLoadProp(properties)
              .setDeletable(false);

       builder.setDorisReadOptions(readOptionBuilder.build())
              .setDorisExecutionOptions(executionBuilder.build())
              .setSerializer(new SimpleStringSerializer())
              .setDorisOptions(dorisBuilder.build());

       //mock data
       DataStreamSource<String> stringDataStreamSource = env.fromCollection(
               Arrays.asList("20230921,home,1003", "20230921,search,1001", "20230923,home,1001"));
       stringDataStreamSource.sinkTo(builder.build());
       env.execute("doris bitmap write");
  }

查詢結(jié)果

mysql> select dt,page,bitmap_to_string(user_id) from `test`.`page_view_bitmap`;
+----------+--------+---------------------------+
| dt       | page   | bitmap_to_string(user_id) |
+----------+--------+---------------------------+
| 20230921 | home   | 1001,1002,1003            |
| 20230921 | search | 1001,1003                 |
| 20230922 | home   | 1002                      |
| 20230922 | mine   | 1001                      |
| 20230923 | home   | 1001                      |
+----------+--------+---------------------------+
5 rows in set (0.00 sec)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘦锹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闪盔,更是在濱河造成了極大的恐慌弯院,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泪掀,死亡現(xiàn)場離奇詭異听绳,居然都是意外死亡,警方通過查閱死者的電腦和手機异赫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門椅挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头岔,“玉大人,你說我怎么就攤上這事鼠证∏杏停” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵名惩,是天一觀的道長澎胡。 經(jīng)常有香客問我,道長娩鹉,這世上最難降的妖魔是什么攻谁? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮弯予,結(jié)果婚禮上戚宦,老公的妹妹穿的比我還像新娘。我一直安慰自己锈嫩,他們只是感情好受楼,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呼寸,像睡著了一般艳汽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上对雪,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天河狐,我揣著相機與錄音,去河邊找鬼瑟捣。 笑死馋艺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的迈套。 我是一名探鬼主播捐祠,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桑李!你這毒婦竟也來了踱蛀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芙扎,失蹤者是張志新(化名)和其女友劉穎星岗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戒洼,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡俏橘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了圈浇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寥掐。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡靴寂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出召耘,到底是詐尸還是另有隱情百炬,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布污它,位于F島的核電站剖踊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衫贬。R本人自食惡果不足惜德澈,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望固惯。 院中可真熱鬧梆造,春花似錦、人聲如沸葬毫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴捡。三九已至忽肛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栈暇,已是汗流浹背麻裁。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工箍镜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留源祈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓色迂,卻偏偏與公主長得像香缺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歇僧,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容