Spark-RDD笔记及集群作业实例

第一部分: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值