00:00
接下来我们要介绍的是大数据处理过程当中一个非常经典非常有名的案例,那就是word count。所谓word count,其实就是要做单词计数,我们的输入呢,那是一个字符串的集合,我们就可以看成一个字符串的列表了,每一个字符串都是有很多单词组成的,那么这些单词呢,是以空格分割,我们现在呢,就是要统计所有的字符串里边出现过的相同的单词,把它们的个数都统计出来,然后呢,按照个数大小进行排序,我们统计排名前三的结果进行输出。我们完整的把这个需求如果做一个详细的分解的话,那发现整个处理流程应该是这样的,一开始输入进来的就是一个字符串的列表,那首先呢,应该把所有的字符串按照空格分割成一个一个的单词,相当于把它要打散,接下来那就是按照单词本身到底是哪个词做一个分组,得到结果呢,把分组之后的单词的个数统计出来,统计出来之后按照从大到小的顺序排序,取前三就是我们要的结果。哎,那这其实是最经典的word count需求的一个描述,我们可以把它叫做普通word count,那接下来我们在代码里边做一个具体的实现。
01:34
新建一个object s17。我们把这个叫做。Work count那方法先写出来,首先我们还是应该把对应的数据拟出来,这是一个string list。写出目前的数据类型的话,那就应该是一个list street啊,那接下来我们就直接把这个list直接放在这儿啊,我们随便写一些数据,换行写的话,这回看看的会更加的清楚一些,Word我们应该多一点重复的数据,所以哈加了。
02:29
啊,那比方说我们还可以,Hello Spark。Scla啊,因为我们知道之后我们要学习的大数据框架Spark,那它就是用scla书写的嘛,啊,那后边大家有可能会学习到的另外一个大数据框架flink,它其实也有非常丰富的scalela对应的接口啊,所以我们也可以hello ink from scalela啊,这是我们当前的数据,接下来呢,那就是要一步一步进行分析了,首先第一步当然就是对字符串并行。
03:17
切割或者切分,按照空格进行切分,把它拆开。而且我们希望应该是要。得到一个阿散。所有。恩慈。啊,列表其实就是要做一个扁平化了啊,那如果我们分布来做的话,我们可以把这个定义出来啊,比方说我们把这个叫做for list list1,那首先就是要低于string list去做一个map操作,这里边当然就是直接调用split方法,要基呃基于空格。一个分分割词进行分割,把单词全部拆开,那得到的呢?其实是一个。
04:06
String类型的array,然后构成的list啊,所以当前其实可以看到得到的结果类型啊,我们可以完整的把这些写出来是一个。一个list是里边的内容呢?呃,每一个元素都是一个string类型的数组,所以这是一个嵌套的列表,那接下来我们自然就要对它做一个打伞的处理。What list2啊,那最终我们希望得到的就是一个list string,这个操作也非常简单,因为前面的what list1直接调一个Fla方法可以了,我们可以在这里做一个测试,看一下之前的what list are是不是我们想要的A后的所有的单词,诶,这个没问题,之前我们做过类似的操作啊,那当然了,对于这一步操作呢,其实我们可以完全把它合并在一起,直接用一个简化之后的得到一个were list啊,直接用一个。
05:12
Flat map可以把它搞定,当然里边传的方法还是split于空格去做一个切割,这里边我们可以print line把它打印出来,For list,看到的结果应该是完全一样的。完全没有问题,切分开的所有的单词,那接下来呢,就是要把相同的单词。好,分组了,相同的单词进行分组,分组操作,我们想到的自然是自然是group by啊,那所以当前要做的其实是broad list,然后去做一个group,那拜什么呢?其实就是BY当前几嘛啊,那我们要传的其实还是一个函数,那这里边就是word,每一个元素都是一个word嘛,所以当前不拿它自己作为K做一个分组就可以了啊,那当然这里大家需要注意啊,尽管我们发现它也符合我们之前的定义。
06:18
参数只在后边出现一次,但是你不能直接把它改成下划线,因为下划线变成一个通配符的话,这个就这个表达含义就容易出现问题了啊,那这里边我们传进来的参数只有一个通配符,下划线编译器会容易出现混淆,所以这里边大家不能做省略啊,把它的这个完整的写出来,然后接下来我们可以每一步都打印,看一下当前的结果到底是什么,我们可以把这个做一个定义啊,对应的类型也写出来,得到的其实是一个map的key呢,是当前的word作为当前的这个键值分组的这个标志组名而得到的。Value,那就是所有的当前的这个word啊,构成的一个list啊,这是我们当前得到的一个,可以把它叫做。
07:10
Group map。把Google map做一个打印输出。我们看到就是这样的,当前word这一组里边只有一个word flink里边只有一个flink,哎,那Spark里边呢,只有一个Spark sc里边,哎,这个很多,三个scla,另外from还有两个,Hello,哎,这里有五个,这个最多,所以接下来我们要干的是什么事呢?其实就是把每一个list里边到底出现了几个,要做一个个数的统计嘛,哎,所以这个统计的话其实非常简单,这不就是把当前的这个。List要做一个取它的size或者取它的length就可以了吗?那当前我们就是第三步,我们是要对分组之后啊。
08:05
List取。长度得到每个单词啊个数,那这里简单的想法,那就是做一个map操作了,Map可以通用进行转换嘛,那这里边map本身每一个都是一个KV,我们想把它转换成什么呢?简单来讲的话,我们当前的这个KV,当前的这个K啊单词你不想把它改变,我们想得到的是一个二元组,就是一个单词。对应着一个它的个数,哎,那所以这里边我们干脆就直接二元组,不是小括号括起来的吗?那就直接用kVA点下划线一还是作为改变之后我们的对应的这个二元组,因为之前map里边这个KY6对就相当于是二元组嘛,啊,那我们还是把它放在这儿,接下来呢,原先的KV的第二个元素这个list,我们是要取它对应的那个长度。
09:12
哎,所以就是直接拿length就完事了,那得到的呢?呃注大家需要注意,就是当前做转换之后得到的类型。还是一个map,只不过当前的map就已经变成了string作为K,而它的value就变成了一个int,就是我们的对应的那个word的。Count值了它的个数出现的个数了,所以我们可以把这个叫做count map。有了这个值之后,接下来其实就是要根据对count值进行排序了,但是我们想排序的这个操作,之前我们讲的时候是只能针对list进行调用,诶,所以我们要对这个map做一个转换,其实这个非常简单,因为我们知道map里边的元素就相当于是一个一个元组类型的这样的一个集合嘛,哎,那么我们把TY都是看成元组的话,Map很容易就可以转换成一个元组类型的list列表,下一步字幕那就是被将map返换为list in排序取前三,因为转换之后这个排序取前三就非常简单了啊呃,用最简单的那些操作就直接可以搞定。
10:31
所以接下来我们要做的就是得到的是一个。Out list它的类型我们希望的那就是一个list里边元素是一个二元组string in,一个word,一个count,一个word,一个count啊,那里边的转换过程呢,当然就是count首先转换成list,怎么转?
11:00
也有一个to list的方法,先把它转换成list,然后接下来呢,要做一个排序,这里需要注意的是,我们排序是按照它的第二个元素,呃,首先大家想到按照第二个元素,那我们可以那个thought by嘛,但是后边我们还要做一个降序处理,所以最简单的方式其实是salt with salt with,我们要按照当前的元素,就是如果本身自己去处理的话,大家还记得之前是直接按一个这个大于号就可以了,对吧,现在呢,不是自己能够大于的,当前我们是一个元组类型嘛,那怎么办呢?哎,取它的下划线二。做一个余号表示,是以它的第二个元素这个字段countt值做一个降序的排列,所以这个实现其实非常简单的,最后我们还可以直接take,嗯,当前列表里边的前三名就可以了。
12:00
就是我们最后得到的结果啊,Outlist可以做一个打印输出,我们看看效果是什么样的。大家看到最后得到的就是前三名哈,有五个skyla有三个,From有两个,这就是我们最终统计出来的workout。
我来说两句