ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5. RDD操作综合实例

2022-04-01 01:01:28  阅读:161  来源: 互联网

标签:flatMap collect RDD 实例 split 操作 re lambda


一、词频统计

A. 分步骤实现

  1. 准备文件

    1. 下载小说或长篇新闻稿

      文件

    2. 上传到hdfs上

      上传文件

  2. 读文件创建RDD

    读文件创建RDD

  3. 分词

    >>> words = lines.flatMap(lambda a:a.split())
    >>> words.collect()
    

    分词

  4. (1)排除大小写lower(),map()

    >>> words2 = words.map(lambda a:a.lower())
    >>> words2.collect()
    

    排除大小写

    (2)标点符号re.split(pattern,str),flatMap()

    导入re,通过re.split('\W+',a)进行对标点符号进行

    \W匹配任何非单词字符,(\W+)匹配任何非单词字符并返回去掉的值

    >>> import re
    >>> words3 = words2.flatMap(lambda a:re.split('\W+', a))
    >>> words3.collect()
    

    除标点符号

    清除多出来的空白数据

    >>> words4 = words3.flatMap(lambda a:a.split())
    >>> words4.collect()
    

    清除无用

    (3)停用词,可网盘下载stopwords.txt,filter()

    下载停用词

    将停用词文件分词储存到变量stopword

    >>> stopword = sc.textFile('stopwords.txt').flatMap(lambda a:a.split()).collect()
    >>> stopword
    

    停用词储存

    筛选出不在停用表中的词

    >>> words5 = words4.filter(lambda a:a not in stopword)
    >>> words5.collect()
    

    排除停用词

    筛选前后对比

    前后对比

    (4)排除长度小于2的词filter()

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

    长度小于2

  5. 统计词频

    (1)先将单词映射成键值对

    >>> wordkv = words6.map(lambda a:(a,1))
    >>> wordkv.collect()
    

    映射键值对

    (2)映射键值对再将key相同的values合并起来,完成词频的统计

    >>> wordkv = wordkv.reduceByKey(lambda a,b:a+b)
    >>> wordkv.collect()
    

    合并key、value

  6. 按词频降序排序

    >>> wordsort = wordkv.sortBy(lambda x:x[1], False)
    >>> wordsort.collect()
    

    词频排序

  7. 输出到文件

    保存文件

    保存文件2

  8. 查看结果

    查看文件前10条结果

    查看结果

B. 一句话实现:文件入文件出

一句话执行

查看文件(由于没有去除停用表内的词,所以结果可能会与前面不同)

一句话查看文件

C. 和作业2的“二、Python编程练习:英文文本的词频统计 ”进行比较,理解Spark编程的特点。

在Spark中,RDD允许用户显式地将工作集缓存在内存中,后续能够重用工作集,这极大地提升了速度。

其中,Spark提供的主要抽象是弹性分布式数据集(RDD),通常RDD很大,会被分成很多个分区,分别保存在不同的节点上。分区可以增加并行度,减少通信开销。

RDD通过打开HDFS(或其他hadoop支持的文件系统)上的一个文件、在驱动程序中打开一个已有的Scala集合或由其他RDD转换操作得到。

用户可以要求Spark将RDD持久化到内存中,这样就可以有效地在并行操作中复用。另外,在节点发生错误时RDD可以自动恢复。

二、求Top值

网盘下载payment.txt文件,通过RDD操作实现选出最大支付额的用户。

将文件上传到hdfs中

求top1

1.丢弃不合规范的行:

>>> import re
>>> account = sc.textFile('payment.txt').flatMap(lambda x:x.split()).flatMap(lambda x:re.split('\W+',x)).flatMap(lambda a:a.split())
>>> account.collect()

求top2

2.按支付金额排序

  • 将金额映射成KV值相同的键值对,这里映射value注意要转为int类型
>>> accountkv = account.map(lambda a:(a,int(a)))
>>> accountkv.collect()

求top3

  • 对键值对进行累加统计和排序
>>> accountsort = accountkv.reduceByKey(lambda a,b:a+b).sortBy(lambda x:x[1], False)
>>> accountsort.collect()

求top4

3.取出Top3

输出文件并查看结果

求top5

求top6

标签:flatMap,collect,RDD,实例,split,操作,re,lambda
来源: https://www.cnblogs.com/ztop/p/16084912.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有