本系列文章将从热词统计需求讲起,讲解flink在实际项目中的应用、部署、容错。项目中的代码为scala所编写,没有用 java 的原因是scala语言看起来更加简练,同时与java语言的兼容性较好,可以直接引用java中的类。

定义数据格式

本篇文章会讲述热词统计最核心的一个功能实现,即消息传递过来的是搜索的单词,程序中进行统计。基于此我们定义传递的数据格式为 ${timestamp},${word} ,之所以有timestamp是为了标注搜索时间,用于修正flink中的watermask

离线数据模拟

定义好了数据格式之后,我们可以将其转换为scala中的Tuple,这里我们先利用fromElements api 创建离线数据用于调试

val currentTimeStamp = System.currentTimeMillis()

val dataStream = env.fromElements(

(currentTimeStamp,"word1"),

(currentTimeStamp+1,"word2"),

(currentTimeStamp+2,"word1"),

(currentTimeStamp+3,"word3"),

)

复制代码

具体计算

我们要实现统计的功能,即求和,需要flink中的sum这个operator,通过[flink-1.8文档/操作符]发现,只有keyedStream这个对象才有sum方法,所以在执行sum之前得先调用keyBy方法将dataStream转换为keyedStream。接下来是这两个方法具体的传参,我们有两个字段,时间戳和单词,要对单词进行keyBy操作需传入1(下标从0开始),但是sum方法要传什么呢?这个时候我们发现我们的对象中没有可以用来求和的,所以我们需要将数据结构从 ${timestamp},${word} 转换为 ${timestamp},${word},${count} ,这就得使用map方法了,其中count为1。经过如上分析,有如下代码

dataStream

.map(x => (x._1, x._2, 1))

.keyBy(1)

.sum(2)

.print()

复制代码

为便于调试,最后的结果输出为到控制台即为

6> (1556680015646,word2,1)

12> (1556680015648,word3,1)

10> (1556680015647,word1,1)

10> (1556680015647,word1,2)

输出结果中开头的数字即为线程的标示,这里我们看出,word2和word3分别是不同的线程,而word1则为同一个线程

疑问解答

为什么这里关于word1的统计有两次输出呢? 因为这里是实时流式计算,来一条数据,各个operator就会为它计算一次,所以最后都有一次对应的输出

那什么时候输出的个数会变少呢? 在使用window的时候,多个数据会按照一定的规则(根据个数或者根据时间段)聚集在一个window中,然后每一个window就只有一个输出结果

小技巧

这里我们使用的scala语言来编写flink项目,需要注意的是要在pom.xml文件中加上如下代码,使其能够支持scala编译

net.alchim31.maven

scala-maven-plugin

scala-compile-first

process-resources

compile

scala-test-compile

process-test-resources

testCompile

-Xms128m

-Xmx512m

复制代码

在项目的引用中,需要引用scala后缀的,如

2.11

1.8.0

org.apache.flink

flink-streaming-scala_${scala.binary.version}

${flink.version}

复制代码

文件中的引用,在你输入 StreamExecutionEnvironment 的时候,Intellij会提示你引入 org.apache.flink.streaming.api.scala. StreamExecutionEnvironment ,但是当你调用 env.fromElements() 方法的时候你会编译器会有类型错误的提示

这个时候你只需要把文件头部的引用改为

import org.apache.flink.streaming.api.scala._

就可以了

java 热词推荐搜索实现,Flink 热词统计(1): 基础功能实现相关推荐

  1. java 热词推荐搜索实现,一个热词推荐的简单实现

    原标题:一个热词推荐的简单实现 为什么想做这个东西 一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章< Redis 与搜索热词推荐 >,然而只写了思路.所以,就是想自己 ...

  2. java 热词推荐搜索实现,Redis 与搜索热词推荐

    本文解决一个非常普通的需求:在用户输入搜索关键词的过程中,系统给出搜索的推荐关键词. 实现的方式还是通过 redis,这次使用它 5 种数据结构中的 zset,也就是有序集合. Redis的有序集合( ...

  3. java别踩白块_java别踩白块(基础功能)

    首先理一下思路: 1.创建界面                      创建一个背景类,主函数入口. 2.创建方块,从顶端出现.               创建一个节点类. 3.使方块下降,每秒一 ...

  4. 推荐系统系列 - 实例一 - 基于流行度的算法 - 搜索热词推荐

    目录 背景 基础知识 数据清洗 计算热度推荐词 查看结果 背景 在新的系统里面,早期都是没有很多数据,很难直接拿来做推荐系统,这就是有些算法存在冷启动的问题,所以在系统早期推荐都是基于热度(流行度)或 ...

  5. ecshop 搜索热词推荐_多多搜索自定义关键词推广的基础点:如何选对致命的关键词...

    很多商家可能会疑惑我为什么不讲点击率,点击率固然重要,但其实多多搜索是围绕关键词展开的.正所谓万丈高楼平地起,关键词才是多多搜索的基础,没有这个基础,买家都搜不到你,或者搜到了却不是精准人群,点击率也 ...

  6. ecshop 搜索热词推荐_拼多多搜索推广实操——如何选择正确的关键词实现高投产!...

    原标题:拼多多搜索推广实操--如何选择正确的关键词实现高投产! 大家好我是拼多多运营林枫,每天都会更新新的内容哦,没关注的记得关注一下哦! 今天和大家讲讲搜索推广怎么正确选择有效的关键词,很多商家可能 ...

  7. java 热词_一个热词推荐的简单实现

    为什么想做这个东西 一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章:Redis 与搜索热词推荐,然而只写了思路.所以,就是想自己实现一个. 先上个效果图,再聊: P.S. 按四年 ...

  8. 一个热词推荐的简单实现

    2019独角兽企业重金招聘Python工程师标准>>> 为什么想做这个东西 一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章:Redis 与搜索热词推荐,然而只写 ...

  9. Flink学习笔记(八):flink热词统计

    我们在网页上经常可以看到比如 百度热榜,微博热搜 这样的排行数据,那么我们在进行网络搜索的时候如何统计这些数据呢? 热词统计有很多中方法,这里主要记录下flink如何进行热词统计. 一.场景 小白在网 ...

最新文章

  1. sqlite自己主动更新数据库
  2. java基础题 解析_Java基础面试题及答案解析(10)
  3. edge浏览器如何把网页放到桌面_电脑如何添加便签,便签怎么放到桌面上
  4. 插值问题(拉格朗日插值、牛顿插值)
  5. 阿里技术副总裁贾扬清、微软 CTO 韦青重磅出席 AI 开发者大会!
  6. Ros学习笔记(二)创建功能包
  7. mybatis中的SqlMapConfig.xml配置文件基本使用
  8. 九款个人知识管理工具介绍
  9. 波浪谱 matlab画,matlab窄带随机过程
  10. Selenium应用中使用chrome浏览器时的新手安装教程
  11. JAVA设计模式总结之六大设计原则(一)
  12. 基于近半年Twitter与Github趋势分析_12大分类500+ChatGPT最新开源GitHub存储库(涵盖ChatGPT开发全框架、全编程语言及教程)——每周更新
  13. L2-003. 月饼
  14. 致得E6协同文档管理软件 推出4.0免费版
  15. mysql 查看time zone_MySQL查看和修改时区time_zone
  16. 要嫁就嫁个37度男人(转载)
  17. SIGGRAPH中海洋的研究学习
  18. 二叉排序树的平均查找长度(成功不成功)
  19. 自己开发的安卓,电脑远控
  20. SINUMERIK西门子828D/840Dsl数控系统数据采集方法与IP地址参数设定

热门文章

  1. RabbitMQ 3.9
  2. 第二十三届中国零售业博览会将于9月青岛开展,门票申请已开启
  3. 内衣蕾丝面料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. java单机西瓜大作战,合并西瓜大作战
  5. java音乐剪辑代码(只能剪辑从开始到最后的部分,也可以中间截取,加个计数器就行了)
  6. 【R学习进阶】R中的VECTOR是什么意思?
  7. Oracle中实现分组后按时间排序取第一条
  8. 用脚本实现自动抢红包
  9. 2020/7/25 pat甲级45分总结
  10. 苹果CEO乔布斯用人九法则