所有过程按本人实验

并以本人能够接受的方式理解的,大家可以参考,如有问题请留言指正。

样本数据

[hadoop@h201 ~]$ cat hh.txt

hello,world

hello,hadoop

hello,oracle

hadoop,oracle

hello,world

hello,hadoop

hello,oracle

hadoop,oracle

 

词频统计,及其按单词数量倒序排序过程及其详解

1.将文件加载成RDD

Scala>  var file=sc.textFile(hdfs://h201:9000/hh.txt)

2.将每行按逗号拆分,结果装载到一个数组中,每次提取一个单词, _代表每次输入内容的占位符

Scala>  val  h1=file.flatMap(_.split(,))

3. 将数组中的每个元素装载到map方法中执行统一的处理任务,将输入的每个单词返回成k,v 键值对,reduceByKey()方法只对value只运行括号内的方法进行迭代计算_+_ 代表累加,返回的是k和进行过迭代计算的v 键值对

Scala>  val  h2=h1.map(x=>(x,1)).reduceByKey(_+_)

4. 再用第二个map接收上一步的k,v键值对进行交换位置输出例如:

输入的是(hello,5)变成(5,hello

Scala>  val  h3=h2.map(_.2,_.1)

5. 将结果按key值排序

Scala>  val  h4=h4.sortByKey(false)      false=倒序 true=升序

6. 在使用map函数将拍好序的键值对进行交换例如:

(5,hello) (4,hadoop)   变成(hello,5)(hadoop,4)

Scala> val  h5=h4.map(_.2,_.1)

7. 到此已经完成了词频统计并按照单词数量的降序进行了排列已经完成下一步可以将结果输出到文件夹中,注意是一个目录

Scala>  h5.saveAsTextFile("hdfs://h201:9000/output1")

上述所有操作拆分为了方便理解,可以将所有操作合成一条代码:如下

Scala > val wc = file.flatMap(_.split(",")).map(x=>(x,1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).saveAsTextFile(hdfs://h201:9000/output1)

 

flatMap() 与 map() 的区别

flatMap() 与 map() 都是对输入的每行内容做同样的操作但是产生的结果不相同;

例如样本:

hello,world

hello,hadoop

hello,oracle

将文件导入成RDD  =var file=sc.textFile(hdfs://xxx:9000/xx.txt)

同样是用split方法按逗号分隔

Var fm=file.flatMap(_.split(,))   每行按逗号分隔后产生的结果解将每个单词放在一个集合中,下面如果使用fm中的内容是每次只会导入一个单词:

java表示就是{hello,world,hello,hadoop,hello,oracle} 相当于一维数组

Var m=file.map(_.split(,))   每行按逗号分隔后产生的结果是将每行的变成一个字符串数组,再放到一个大的结果集中,下面如果使用m中的内容每次导入一个数组:

java表示就是{{hello,world},{hello,hadoop},{hello,oracle}} 相当于二维数组

这在使用Apache日志统计PV时很有用例如日志格式如下:

123.23.4.5 - - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

23.12.4.5 - - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

我们只需要取出按空格分隔的第一个列即可 这是使用flatMap就不合适了我们可以用map

Salca > var file=sc.textFile(hdfs://h201:9000/access.log)

Salca> var h1=file.map(_.split( ,2))      #按空格分隔最多两列

Salca> var h2=h1.map(x=>(x(0),1))       #输入的数组去第0列,即可取出IP

Salca> var h3=h2.reduceByKey(_+_)      #统计每个链接的登录次数

下面就是排序和保存在这里就不在重复了。