一、词频统计
- 分步骤实现
- 准备文件
- 下载小说或长篇新闻稿
上传到hdfs上
hdfs dfs -ls /hdfs
- 读文件创建RDD
lines = sc.textFile(“file:///home/hadoop/ex1_news.txt”) lines.foreach(print)
- 分词
初次分词:无法分出带有字符的英文字符,需进行再次分词
lines.flatMap(lambda line:line.split()).collect()
第二次分词:分出带有字符的英文字符
- 排除大小写lower(),map()
words1 = words.map(lambda word:word.lower())
words1.collect()
标点符号re.split(pattern,str),flatMap(),
停用词,可网盘下载stopwords.txt,filter(),
with open(‘/home/Hadoop/stopwords.txt’) as s: stops = s.read().split()
words2 = words1.filter(lambda word:word not in stops).count()words.filter(lambda word:word not in stops).collect()
长度小于2的词filter()
words=words1.filter(lambda word:len(word)>2)words.collect()
- 统计词频
wordKv = words.map(lambda word:(word,1)) wordKv.collect()
ww=wordKv.reduceByKey(lambda a,b:a+b)
ww.collect()
- 按词频排序
wwSort=ww.sortBy(lambda ww:ww[1],False,1) wwSort.collect()
- 输出到文件
out_url = 'huangborui' wwSort.saveAsTextFile(out_url)
- 查看结果
hdfs dfs -ls
- 一句话实现:文件入文件出
sc.textFile("file:///home/hadoop/ex1_news.txt").flatMap(lambda line: line.split(" ")).map(lambda word: word.lower()).filter(lambda word: word not in stops).filter(lambda word:len(word)>2).map(lambda word:(word,1)).reduceByKey(lambda x,y :x+y).sortBy(lambda wc:wc[1],False,1).saveAsTextFile("file:///home/hadoop/huangborui")
二、求Top值
网盘下载payment.txt文件,通过RDD操作实现选出最大支付额的用户。
cat payment.txt
lines = sc.textFile("file:///home/hadoop/payment.txt")
lines.take(14)
items = lines.map(lambda line:line.split(',')) //拆分字段
items.collect()
//丢弃空行与字段不完整的行
items.map(lambda item:len(item)).collect()
items.count()
//过滤剩下长度为4的字段
item.filter(lambda item:len(item)==4).collect()
//丢弃有空值的行
//有效的记录
//取前三名
top3 = recs.sortBy(lambda rec:int(rec[2]),False).take(3)