需求分析與思路:
關鍵詞主題這個主要是為了大屏展示中的字符云的展示效果,用于感性的讓大屏觀看者感知目前的用戶都更關心的那些商品和關鍵詞,
關鍵詞的展示也是一種維度聚合的結果,根據聚合的大小來決定關鍵詞的大小,
關鍵詞的第一重要來源的就是用戶在搜索欄的搜索,另外就是從以商品為主題的統計中獲取關鍵詞
IK 分詞器的使用
因為無論是從用戶的搜索欄中,還是從商品名稱中文字都是可能是比較長的,且由多個關鍵詞組成
所以我們需要根據把長文本分割成一個一個的詞,這種分詞技術,在搜索引擎中可能會用到,對于中文分詞,現在的搜索引擎基本上都是使用的第三方分詞器,咱們在計算資料中也可以使用和搜索引擎中一致的分詞器,IK,
public class KeywordStatsApp {
public static void main(String[] args) throws Exception {
//TODO 1.獲取執行環境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
//1.1 設定CK&狀態后端
//env.setStateBackend(new FsStateBackend("hdfs://hadoop102:8020/gmall-flink-210325/ck"));
//env.enableCheckpointing(5000L);
//env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
//env.getCheckpointConfig().setCheckpointTimeout(10000L);
//env.getCheckpointConfig().setMaxConcurrentCheckpoints(2);
//env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3000);
//env.setRestartStrategy(RestartStrategies.fixedDelayRestart());
//TODO 2.使用DDL方式讀取Kafka資料創建表
String groupId = "keyword_stats_app";
String pageViewSourceTopic = "dwd_page_log";
tableEnv.executeSql("create table page_view( " +
" `common` Map<STRING,STRING>, " +
" `page` Map<STRING,STRING>, " +
" `ts` BIGINT, " +
" `rt` as TO_TIMESTAMP(FROM_UNIXTIME(ts/1000)), " +
" WATERMARK FOR rt AS rt - INTERVAL '1' SECOND " +
") with (" + MyKafkaUtil.getKafkaDDL(pageViewSourceTopic, groupId) + ")");
//TODO 3.過濾資料 上一跳頁面為"search" and 搜索詞 is not null
Table fullWordTable = tableEnv.sqlQuery("" +
"select " +
" page['item'] full_word, " +
" rt " +
"from " +
" page_view " +
"where " +
" page['last_page_id']='search' and page['item'] is not null");
//TODO 4.注冊UDTF,進行分詞處理
tableEnv.createTemporarySystemFunction("split_words", SplitFunction.class);
Table wordTable = tableEnv.sqlQuery("" +
"SELECT " +
" word, " +
" rt " +
"FROM " +
" " + fullWordTable + ", LATERAL TABLE(split_words(full_word))");
//TODO 5.分組、開窗、聚合
Table resultTable = tableEnv.sqlQuery("" +
"select " +
" 'search' source, " +
" DATE_FORMAT(TUMBLE_START(rt, INTERVAL '10' SECOND), 'yyyy-MM-dd HH:mm:ss') stt, " +
" DATE_FORMAT(TUMBLE_END(rt, INTERVAL '10' SECOND), 'yyyy-MM-dd HH:mm:ss') edt, " +
" word keyword, " +
" count(*) ct, " +
" UNIX_TIMESTAMP()*1000 ts " +
"from " + wordTable + " " +
"group by " +
" word, " +
" TUMBLE(rt, INTERVAL '10' SECOND)");
//TODO 6.將動態表轉換為流
DataStream<KeywordStats> keywordStatsDataStream = tableEnv.toAppendStream(resultTable, KeywordStats.class);
//TODO 7.將資料列印并寫入ClickHouse
keywordStatsDataStream.print();
keywordStatsDataStream.addSink(ClickHouseUtil.getSink("insert into keyword_stats_210325(keyword,ct,source,stt,edt,ts) values(?,?,?,?,?,?)"));
//TODO 8.啟動任務
env.execute("KeywordStatsApp");
}
}
代碼流程圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/420012.html
標籤:其他
上一篇:zookeeper原始碼決議--請求處理--Leader.ToBeAppliedRequestProcessor
下一篇:用戶畫像基礎之資料架構
