Spark经典案例2-数据去重

Spark经典案例之数据去重 /** 业务场景:数据去重问题 Created by YJ on 2017/2/7. 统计数据,尽量用reduceByKey,不要用groupByKey,优化点 reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上汇总,(汇总要压力小) groupByKey,发送本机所有的map,在一个机器上汇总(汇总压力大)/ / 数据格式 flie1: 2012-3... 阅读详情

/**
* 业务场景:数据去重问题
* Created by YJ on 2017/2/7.
* 统计数据,尽量用reduceByKey,不要用groupByKey,优化点
* reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上汇总,(汇总要压力小)
* groupByKey,发送本机所有的map,在一个机器上汇总(汇总压力大)
*/
/*

数据格式
flie1:
2012-3-1 a
2012-3-2 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-7 c
2012-3-3 c
flie2:
2012-3-1 b
2012-3-2 a
2012-3-3 b
2012-3-4 d
2012-3-5 a
2012-3-6 c
2012-3-7 d
2012-3-3 c
*/

package ClassicCase

import org.apache.spark.{SparkConf, SparkContext}
object case2 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("reduce")
    val sc = new SparkContext(conf)
    sc.setLogLevel("ERROR")
    //获取数据
    val two = sc.textFile("hdfs://192.168.109.130:8020//user/flume/ClassicCase/case2/*")
    two.filter(_.trim().length>0) //需要有空格。
        .map(line=>(line.trim,""))//全部值当key,(key value,"")
          .groupByKey()//groupByKey,过滤重复的key value ,发送到总机器上汇总
              .sortByKey() //按key value的自然顺序排序
                  .keys.collect().foreach(println) //所有的keys变成数组再输出
    //第二种有风险
    two.filter(_.trim().length>0)
          .map(line=>(line.trim,"1"))
            .distinct()
                .reduceByKey(_+_)
                    .sortByKey()
                        .foreach(println)

    //reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上汇总,(汇总要压力小)
    //groupByKey,发送本机所有的map,在一个机器上汇总(汇总压力大)
    //如果数据在不同的机器上,则会出现先重复数据,distinct,reduceBykey,只是在本机上去重,谨慎一点的话,在reduceByKey后面需要加多一个distinct

  }
}

输出结果
2012-3-1 a
2012-3-1 b
2012-3-2 a
2012-3-2 b
2012-3-3 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-6 c
2012-3-7 c
2012-3-7 d
(2012-3-1 a,1)
(2012-3-1 b,1)
(2012-3-2 a,1)
(2012-3-2 b,1)
(2012-3-3 b,1)
(2012-3-3 c,1)
(2012-3-4 d,1)
(2012-3-5 a,1)
(2012-3-6 b,1)
(2012-3-6 c,1)
(2012-3-7 c,1)
(2012-3-7 d,1)

reduceByKey和groupByKey区别与用法

(1)当采用reduceByKeyt时,Spark可以在每个分区移动数据之前将待输出数据与一个共用的key结合。借助下图可以理解在reduceByKey里究竟发生了什么。 注意在数据对被搬移前同一机器上同样的key是怎样被组合的(reduceByKey中的lamdba函数)。然后lamdba函数在每个区上被再次调用来将所有值reduce成一个最终结果。整个过程如下:
这里写图片描述

(2)当采用groupByKey时,由于它不接收函数,spark只能先将所有的键值对(key-value pair)都移动,这样的后果是集群节点之间的开销很大,导致传输延时。整个过程如下:
这里写图片描述

( 3 )区别
reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上suffle汇总map,(汇总要压力小)
groupByKey,发送本机所有的map,在一个机器上suffle汇总map(汇总压力大)

因此,在对大数据进行复杂计算时,reduceByKey优于groupByKey。
另外,如果仅仅是group处理,那么以下函数应该优先于 groupByKey :
  (1)、combineByKey 组合数据,但是组合之后的数据类型与输入时值的类型不一样。
  (2)、foldByKey合并每一个 key 的所有值,在级联函数和“零值”中使用。

使用Scala语言编写Spark应用程序实现数据去重 使用Scala语言编写Spark应用程序实现数据去重一、题目需求二、建立目录结构(一)创建 sparkapp4 文件夹并切换(二)创建 data 文件夹(存放A.txt B.txt)(三)创建 /src/main/scala 文件夹用来存放代码(四)编写代码(五)编写 simple.sbt三、编译及运行(一)编译(二)运行(三)验证 一、题目需求 使用Scala语言编写Spark应用程序实现数据去重(需要使用编译打包工具Maven或sbt进行编译打包)。 对于两个输入文件A和B,编写Spark独立应用程序, 阅读详情

相关推荐

大数据Spark面试,distinct去重原理,是如何实现的

最近,有位朋友问我,distinct去重原理是怎么实现的? “在面试时,面试官问他了解distinct算子吗?” “了解啊,Spark的rdd,一种transFormation去重的算子,主要用来去重的”。 “哟,看来你经常使用distinct算子,对distinct算子很熟悉啊”。 “好说,好说”。 “那你能说说distinct是如何实现去重的吗?” 我朋友支支吾吾半天:“就是这样、那样去重的啊”。 “这样、那样是怎么去重的呢” “具体有点忘记了(其实是根本就不知道)”。 那么disti

hechaoyong12345的博客 2284

spark5种去重方式,快速去重

双重group by将去重分成了两步,是分组聚合运算,group by操作能进行多个reduce任务并行处理,每个reduce都能收到一部分数据然后进行分组内去重,不再像distinct只有一个reduce进行全局去重.sql中最简单的方式,当数据量小的时候性能还好.当数据量大的时候性能较差.因为distinct全局只有一个reduce任务来做去重操作,极容易发生数据倾斜的情况,整体运行效率较慢.DataFrame中,可以先将分区内数据进行排序,然后通过dropDuplicates将重复的数据删除.

qq_39285950的博客 8611

Python 如何对上万、百万、亿级数据去重?

今天我们要一起探索一个让数据工程师、数据科学家和开发者们都头疼的问题:如何对海量数据进行去重。随着数据量的不断增长,我们在处理数据时,去重操作变得愈发重要且复杂。那么,Python 是如何帮助我们高效地对上万、百万,甚至亿级数据进行去重的呢?

小鸿的博客 2507

Spark1.x升级Spark2.x常见异常【map】

一.创建Spark入口 相较于Spark1.x,Spark2.x最明显的区别就是程序执行入口的区别了,从SparkContext变为SparkSession。相较于SparkContext,SparkSession对SparkContext进行了二次封装,把原有Spark1.x中的SQLContext和HiveContext进行了合并,默认为SQLContext,当需要访问Hive时,只需开启对Hive的支持即可【.enableHiveSupport(),当然hive的相关配置还是要设置的】,如下:

踏雪无痕 660

HDFS数据去重实战:基于Spark的HDFS文件去重方案(代码)

你有没有过这样的经历?家里的冰箱塞得满满当当,打开一看,居然有3瓶一模一样的可乐——明明只需要1瓶,却占了3倍空间。文件级重复:同一文件被多次上传到HDFS的不同路径(比如和其实是同一个文件);内容级重复:不同文件名但内容完全相同的文件(比如和内容一致,但文件名不同)。存储空间浪费:HDFS的存储成本虽然低,但海量重复数据会持续吞噬资源(比如1TB重复数据每年可能浪费数千元存储成本);计算效率下降:后续的大数据处理(比如MapReduce、Spark分析)会重复读取这些数据,增加计算时间和资源消耗。

AI架构师小马 1107

导出库的版本_Windows下PaddleOCR在C++中的推理部署(CPU版本)CMake + VS2017

PaddleOCR是一个与OCR相关的开源项目,不仅支持超轻量级中文OCR预测模型,总模型仅8.6M(单模型支持中英文数字组合识别、竖排文本识别、长文本识别,其中检测模型DB(4.1M)+识别模型CRNN(4.5M)),而且提供多种文本检测训练算法(EAST、DB)和多种文本识别训练算法(Rosetta、CRNN、STAR-Net、RARE)。本文将教大家通过PaddleOCR(CPU版...

weixin_31304817的博客 1914

Hadoop经典案例Spark实现(二)——数据去重问题

Hadoop经典案例Spark实现(二)——数据去重问题

Ganymede的Hadoop世界 1万+

AFE芯片做什么用的?AFE(Analog Front End) 模拟前端

AFE采样精度的影响因素非常多,需要综合考虑各种因素,并根据实际应用场景来选择合适的参数和方法。通过减少噪声、提高采样频率、调节放大器增益、降低电源噪声、优化传输线路、进行温度补偿、选择合适的ADC分辨率、根据信号类型选择合适的AFE参数、进行器件匹配和校准等方法,可以提高AFE的采样精度,从而更好地满足各种应用需求。版权声明:本文为优快云博主「czf.Forver」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

学海无涯的专栏 4万+

spark写入es出现部分数据重复问题排查和解决

问题背景 作业流程是从hive读取数据处理后写入es,一直跑的很正常,突然今天发现部分数据重复了 问题排查 由于是长期正常运行的作业未发生变更,且排查了上游hive表不存在数据重复问题,首先排除了数据和逻辑问题 spark作业是运行成功的,不存在作业失败重试的问题 推测是spark作业内部存在失败重试的问题,于是查看了spark history job的 timeline看到下面这个图表,可以确认是由于11、13节点在写入部分数据后失败了,yarn启动了21、22重新执行导致11、13写入的数据又

大数据开发实践者 2438

Java Web 图书管理系统的制作指南

实现对图书信息的增删改查(CRUD)操作。支持用户登录与权限管理。图书借阅与归还功能。系统管理员可以管理用户信息和图书库存。

Xiaoxin的博客 1629

HSPICE用户必看:用Sigrity Broadband SPICE解决复杂封装建模的3个技巧

本文为HSPICE用户分享了三个使用Sigrity Broadband SPICE解决复杂封装建模难题的实战技巧。通过将宽频带S参数高效转换为时域SPICE模型,能显著提升仿真速度、保障收敛性,并精准分析谐振、返回路径不连续及超多端口PDN等关键问题,助力实现高效稳定的系统级信号与电源完整性分析。

metal的博客 600

用spark中DataFrame对数据进行去重、缺失值处理、异常值处理

用spark中DataFrame对数据进行清洗1. 准备工作2. 数据去重3. 缺失值处理4. 异常值处理 1. 准备工作 配置环境 import os from pyspark import SparkContext,SparkConf from pyspark.sql import SparkSession import pyspark.sql.functions as fn JAVA_HOME = '/root/bigdata/jdk' PYSPARK_PYTHON = "/miniconda2/e

cjl的博客 1万+

SAP MIGO屏幕增强的具体实施步骤介绍(SE19:MB_MIGO_BADI) <转载>

1.MIGO抬头屏幕增强具体增强实施步骤1.1.创建存储抬头客制化数据的增强表1.2.创建增强结构1.3.创建函数组ZMM_MIGO1.3.1.定义全局变量1.3.2.创建数据处理函数1.4.创建字屏幕9001屏幕PBOendif.endloop.1.5.实施新BADI增强SE19创建BADI实施双击实施类ZCL_MIGO_EN_01exportingendif.endmethod.endif.endif.exportingendmethod.

qq_55488207的博客 4511

spark去重优化

在spark的任务中,用的较多的去重方法是dataframe的distinct,笔者在测试中发现这种方法其实很次的,尤其是在大量数据的去重的过程中。 测试数据的数据结构如下,主要是userid,其他字段随意。 userid:String, column1:String 数据大小 方法一,使用dataframe的distinct去重: df.selectExpr($"userid").distinct() 这种方法是最简单而且个人认为效率是最次的,当时测试了16260037条数据,对用户id去重,其实去

luohaifang的博客 3697

Python爬虫:无账号无限制获取企查查信息

无限制企查查爬虫 ​通过网上爬虫获取了全国所有企业,然后就需要补充企业信息,首先想到的就是企查查,启信宝等专业网站,最终选择了企查查,尝试了多种方法: 1、selenium爬虫,绕过企查查的登录验证,但账号和IP限制太大,最终放弃 2、通过requests直接请求+cookies,遇到了cookie有效期和限制问题 不断的尝试和修改参数,最终发现一种有效方式selenium+ wep 只需要IP代理,不需要账号,没有限制,因为是没有登录,拿到的信息有限,能展示的都能获取。 一、初始化..

攻城狮的家园 1万+

uniapp - H5网页uni.getLocation报错getLocation:fail Geolocation permission denied.Get ipLocation failed.

uni.getLocation getLocation:fail Geolocation permission denied.Get ipLocation failed.,uni.getLocation定位失败,uni-app getLocation()无法获取定位,一直fail()uniapp移动端h5网页,uniApp微信内置浏览器定位失败,如何解决这个问题,uniapp h5 uni.getLocation获取位置失败怎么办,UNI-APP获取当前位置,uni.getLocation定位失败,unia

🏆 前端领域优质创作者 4242

scala spark数据去重实验

目标:读取文件数据,去重,排序输出 数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次 实验文件 file1.txt 2012-3-1 a 2012-3-2 b 2012-3-3 c 2012-3-4 d 2012-3-5 a 2012-3-6 b 2012-3-7 c 2012-3-3 c file2.txt 2012-3-1 b 2012-3-2 a 2...

猪坚强-历经磨难亦不忘初心 2535

云端全自动AI漫剧生成工作流:从模型选型到完整实现

本文提出了一套云端全自动AI漫剧生成工作流解决方案,旨在解决传统漫剧制作效率低下的问题。该系统采用"编排引擎+模型矩阵"架构,通过集成大语言模型、图像生成、视频合成等技术,实现从剧本输入到成片输出的全流程自动化。 核心内容包括: 模型选型方案:剧本解析采用DeepSeek-V3/GPT-4o,图像生成使用DALL-E 3,视频合成选用Stable Video Diffusion,语音合成采用MiniMax TTS 系统架构设计:基于Celery分布式任务队列的编排层,分解任务至各功能模块

huanghm88的专栏 643

spark streaming去重

spark streaming去重 由于客观原因,后台系统在记录的日志中有重复数据,重复数据的生成时间一般间隔在1s之内,在spark对日志数据进行消费处理时,需要对数据去重,减少对Hbase的写入。 本文给出两种思路。

量子人生 8391

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spark的dropDuplicates或distinct 对数据去重

消除重复的数据可以通过使用 distinct 和 dropDuplicates 两个方法。

Code_LT的博客 3658

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spark选择去重

在spark计算当中,我们日常有些简单需求,比如去重,比如有四列(appid、date、type、platform),我们只需要对appid,date进行去重,另外两列不关注。在spark中,distinct会对所有列执行去重操作,两行比较,只要有个一列有差异,就不算重复。 要解决,只对某几列进行去重,可以使用Top N 的思路,也就是先分组,分组后,我们只取row_num=1第...

阿正的博客 4517

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

spark 流式去重

大数据去重本身很蛋疼,针对个别数据去重更是不可理喻但是spark的Structured Streaming就很容易能实现这个功能。听浪尖给你娓娓道来~数据从采集到最终处理...

大数据星球-浪尖 2501

spark RDD编程 第1关:数据去重

Spark RDD编程初级实践(一) 任务描述 本关任务:编写Spark独立应用程序实现数据去重。 相关知识 为了完成本关任务,你需要掌握:RDD的创建;RDD的转换操作;RDD的行动操作。 RDD的创建 使用textFile()方法从本地文件系统中加载数据创建RDD,示例如下: val lines = sc.textFile("file:///home/hadoop/word.txt") 执行sc.textFile()方法以后,Spark从本地文件word.txt中加载数据到内存,在内存中生成

weixin_44686879的博客 5953
上一篇: Spark经典案例1-通过采集的气象数据分析每年的最高温度
下一篇: Spark经典案例3-数据排序
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值