第一部分:RDD笔记
定义:Resilient Distributed Dataset(弹性分布式数据集)
- RDD是Spark应用程序中的数据表示形式
- RDD是一种分布式的内存抽象
- RDD具有数据流模型的特点:自动容错、位置感知调度和可伸缩性
- RDD是只读的记录分区的集合,使得实现容错的开销很低
- RDD是高度受限的共享集合
特性:
- 分区(partition):RDD的基本组成单位
对于一个RDD,分区的多少决定了这个RDD进行并行计算的粒度,每个RDD分区的计算都在一个单独的任务中执行。 - 依赖(dependency):便于RDD作业的调度与容错
- 窄依赖:子RDD的每个分区依赖于常数个父分区(即与数据规模无关)。
- 宽依赖:子RDD的每个分区依赖于所有父RDD分区。
- 计算(compute):每个RDD中保存一个操作,指明是如何从父RDD生成得
- 对于Key-Value形式的RDD可以指定分区规则
- 优先位置(preferred locations)
操作:匆忙整了张简易表
第二部分:spark简单操作
1.惯例先来个简单的wordcount,txt文档如下:
hello spark
hello hbase
spark spark
三行以空格分开的文本,先上传到hdfs上,查看
hadoop fs -put ~/file.txt /home/hduser/wordcount
hadoop fs -ls /home/hduser/wordcount
首先在spark-shell中创建rdd,读取该文件,每行以空格切分,其次将每个元素转换成value值为1的key-value形式,相同key的value值相加,最后将结果按value值从大到小排序:
val wcrdd=sc.textFile("hdfs://node01:9000/home/hduser/wordcount/file.txt").flatMap(line =>line.split(" ")).map(word =>(word,1)).reduceByKey((a,b) =>a+b).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).collect
或者简写为
val wcrdd=sc.textFile("hdfs://node01:9000/home/hduser/wordcount/file.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).collect
慎用collect,这里三行文本无所谓了。
2.Sogou数据统计
放链接,数据有点老了,感兴趣可以自己爬
链接: https://pan.baidu.com/s/1dFaU3XB 密码: n5dp
先看看数据结构
hadoop fs -tail /home/hduser/wordcount/sogou.utf8
- 统计“20111230010101”时间点后访问记录的个数(字符串比较)
val data=sc.textFile("hdfs://node01:9000/home/hduser/wordcount/sogou.utf8").cache
data.count
data.map(_.split("\t")(0)).filter(_>"20111230010101").count
切分每行数据,并取第一个数与“20111230010101”对比,筛选出比它大的值,返回个数。
- 统计排名、点击都是第一的链接个数
data.map(_.split("\t")).filter(_.length == 6).filter(_(3).toInt == 1).filter(_(4)=="1").count
- 统计包含”google”关键字的记录
data.(_.split("\t")).filter(_.length == 6).filter(_(2).contains("google")).count
- 关键字搜索排行
data.map(_.split("\t")).map(x=>(x(2),1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).take(10)
对每个关键字转换为value值为1的key-value,对同一个key,value求和。然后key-value互换,按新key值排序排列。最后再互换,并取前10。
- 统计每个链接点击量,排序
data. map(x=>x.split("\t")).map(x=>(x(5),1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).take(10)
对所有统计结果后面可用saveAsTextFile保存到hdfs上,如
data. map(x=>x.split("\t")).map(x=>(x(5),1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).saveAsTextFile("hdfs://node01:9000/home/hduser/output201709")
查看
hadoop fs -ls /home/hduser/wordcount/output
发现多了几个文件:
这时可用 hadoop fs -text
命令跟上文件名查看结果
最后取回到本地:
hadoop fs -getmerge /home/hduser/wordcount/output201709/part-00000 /home/hduser/wordcount/output201709/part-00001 ~/result.txt