5.RDD操作综合实例

一、词频统计

A.分步骤实现:1. 准备文件

文章地址:https://www.neelc.org/posts/web3-centralized/
Web3_is_centralized是文件名

hdfs dfs -put ./Web3_is_centralized.txt ./Web3_is_centralized.txt

2. 读文件创建RDD

lines = sc.textFile("Web3_is_centralized.txt")
lines.count()

image

3. 分词

words = lines.flatMap(lambda line:line.split())
words.collect()

image

4. 排除大小写,标点符号,停用词,长度小于2的词

排除大小写

words = words.map(lambda word:word.lower())
words.collect()

image

排除标点符号

words = words.flatMap(lambda a:re.split('[\W\_]',a))
words.collect()

image

排除停用词

# 读取停用词
stopdata = sc.textFile('stopwords.txt').flatMap(lambda a:a.split())
stopdata.collect()

image

# 排除停用词
stopdatas = stopdata.collect()
words = words.filter(lambda a:a not in stopdatas)
words.collect()

image

排除长度小于2的词

words = words.filter(lambda a:len(a)>2)
words.collect()

image

5. 统计词频

words = words.map(lambda word:(word,1))
wordCount = words.reduceByKey(lambda a,b:a+b)
wordCount.collect()

image

6. 排序

wcSort = wordCount.sortBy(lambda wc:wc[1],False)
wcSort.collect()

image

7. 输出到文件

wcSort.saveAsTextFile("wc_out_Web3_is_centralized")

8. 查看结果

hdfs dfs -cat ./wc_out_Web3_is_centralized/part-00000

image

B.一句话实现

# 读取停用词
stopdatas = sc.textFile('stopwords.txt').flatMap(lambda a:a.split()).collect()

sc.textFile("Web3_is_centralized.txt")\
.flatMap(lambda line:line.split())\
.map(lambda word:word.lower())\
.flatMap(lambda a:re.split('[\W\_]',a))\
.filter(lambda a:a not in stopdatas)\
.filter(lambda a:len(a)>2)\
.map(lambda word:(word,1))\
.reduceByKey(lambda a,b:a+b)\
.sortBy(lambda wc:wc[1],False)\
.saveAsTextFile("wc_out_Web3_is_centralized_1")

查看结果

hdfs dfs -cat ./wc_out_Web3_is_centralized_1/part-00000

image

C. 理解Spark编程的特点

  • Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快十倍;
  • Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算;
  • Spark可运行于独立的集群模式中,或者运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。

二、求Top值

image

1. 丢弃不合规范的行:

拆分字段

items = lines.map(lambda line:line.split(','))
items.collect()

image

丢弃空行与字段不完整的行

items.map(lambda item:len(item)).collect()
items.count()
items.filter(lambda item:len(item)==4).collect()
items.filter(lambda item:len(item)==4).map(lambda item:len(item)).collect()
items.filter(lambda item:len(item)==4).map(lambda item:len(item)).count()

image

丢弃有空值的行

items.filter(lambda item:len([i for i in item if len(i)>0])==4).collect()
items.filter(lambda item:len([i for i in item if len(i)>0])==4).count()

image

2-3. 按支付金额排序,取出Top3

recs = items.filter(lambda item:len([i for i in item if len(i)>0])==4)
recs.sortBy(lambda rec:int(rec[2]),False).collect()
top3 = recs.sortBy(lambda rec:int(rec[2]),False).take(3)
top3

image

posted @ 2022-03-23 21:56  紫陌凛风  阅读(72)  评论(4编辑  收藏  举报