- 博客(45)
- 收藏
- 关注
原创 案例-流量统计
但是,这里有一个问题:map和reduce这两个函数都是通过key,value的方式来进行数据交互的,这里的key可以设置为手机号,而value值就比较复杂,它有两个信息:上行流量和下行流量要统计。而这就必然引出一个新的问题:因为key,value是需要进行磁盘的读写的,所以它们必须要能序列化,如果我们创建一个新的类来描述流量数据,就必须也实现序列化。在map阶段,我们读入每一行数据,通过空格分割,切分字段,抽取手机号,上行流量和下行流量。在reduce阶段,我们把相同手机号的数据进行求和汇总。
2025-04-15 08:15:47
168
原创 一分钟学会数据清洗
它是指对采集到的原始数据进行预处理,以去除错误、重复、不完整或不一致的数据,使数据符合分析要求的过程。对于reduce函数来说,它的输入参数是:<刷选后的每一行的内容,[null,null,...]>,对于我们的需求来说,并不需要这个阶段。在之前的项目的基础之上,重写去写一个包,并创建两个类:WebLogMapper和WebLogDriver类。map阶段:按行读入内容,对内容进行检查,如果字段的个数少于等于11,就删除这条日志(不保留)<偏移量,每一行的内容> → <刷选后的没一行的内容,null>
2025-04-02 15:43:53
226
原创 mapreduce的工作原理
虽然新框架(如 Spark)在性能上更优,但 MapReduce 仍是 Hadoop 生态的核心组件,理解其原理对学习大数据技术至关重要。的思想,将大数据任务分解为多个小任务,并行处理后再合并结果。如果某个 Task 执行过慢,集群会启动相同任务的备份,取最先完成的结果。:在 Reduce 阶段前,数据按键排序,便于归约处理。在 Map 阶段后,先对本地数据进行聚合,减少网络传输。:处理输入数据,生成键值对(Key-Value)。:合并 Map 阶段的输出,生成最终结果。读取输入分片,逐行处理数据,生成。
2025-03-31 20:08:12
912
原创 Hadoop集群的常见命令
本文介绍了Hadoop集群中最常用的HDFS、YARN和集群管理命令,涵盖文件操作、资源调度和集群维护等方面。熟练掌握这些命令,可以更高效地管理和优化Hadoop集群。希望这篇指南对您有所帮助!如果有任何问题或补充,欢迎在评论区留言讨论。
2025-03-31 19:58:20
782
原创 【Linux】配置hosts
把虚拟机上的软件yum想象成你自己开的一家商场,那么yum的源就是你的供货商。hosts 文件是一个本地的文本文件,它的作用是将主机名映射到对应的 IP 地址,在 DNS(域名系统)解析之前,系统会先查询 hosts 文件来确定目标主机的 IP 地址。2.浏览器打开了host文件,发现了我们加入的这一行代码,然后,去访问127.0.0.1这个ip地址。网络上的免费而稳定的源有很多,这里我们选择阿里云的源。现在我们可以通过finalshell这个工具来连接我们的远程服务器,不过我们连接主机的时候,需要。
2025-03-04 09:59:17
1252
原创 VMware虚拟机IP配置
linux中,ip地址是写在配置文件(/etc/sysconfig/network-scripts/ifcfg-ens33)中,这里使用 vi 编辑器去修改即可!如果不进行设置,每次启动机器时都可能是随机的IP,不方便我们后续操作。具体操作是:点击编辑→虚拟网络编辑器。注意:这里的第三个部分的10并不是固定的,我们自己可以约定,但是约定之后就要固定下来。让所有的vm配置的虚拟机使用NAT时,它们的网段都是一致的。具体设置为:进入虚拟机,修改对应的IP。检查是否能Ping通外网。(3)设置虚拟机的IP。
2025-02-26 15:28:18
547
原创 Linux 的基本命令
路径中的特殊字符 :1 .开头是隐藏文件 2 ..当前目录的上一级目录 3 ~波浪线,当前用户的home目录,比如root用户home目录是/root。cd / 根目录 pwd 当前路径 相对路径 绝对路径。
2025-02-19 16:04:08
264
原创 手把手教你使用VMware创建虚拟机
创建完虚拟机后,点击编辑虚拟机设置。选择稍后安装操作系统,点击下一步。点击确定后,就可以开启虚拟机了。选择Linux,点击下一步。设置虚拟机名称,点击下一步。点击创建新的虚拟机图标。选择自定义,点击下一步。
2025-02-18 20:37:53
214
原创 Scala 的迭代器
迭代器需要通过集合对应的迭代器调用迭代器的方法来访问。支持函数式编程风格,便于链式操作。//任务:输出每一个元素//任务:跳过前两个,从第3个开始输出//迭代器//1.创建一个迭代器(iterator)//依次访问每个元素运行结果如下:drop:从当前位置开始,跳过指定数量的元素,得到新的迭代器take:从当前位置开始,取几个元素,得到新的迭代器toList的作用:把迭代器中剩余的元素保存到一个List中zip方法(拉链):把两个迭代器合成一下,得到新的迭代器,长度以短的为准。
2024-12-18 15:37:29
528
原创 Scala 的隐式转换
隐式对象是一个带有implicit关键字的单例对象,它可以用于提供某种类型的实例以供隐式转换使用。思路:把BaseUser 通过隐式转换,改成一个新类型,而是这个新类型中有这新的方法。困难:函数有一个默认数值,在不传入具体的实参时,就会自动使用这个默认值。任务:给之前是BaseUser添加新的功能,但是,不要直接去改代码。隐式对象和前面讲的隐式参数比较类似,都是用来设置初始数据的。它有失败的时候(Double --> Int),有成功的时候。它的作用:拓展已有类的功能,而不需要去修改之前的类的代码。
2024-12-11 16:53:18
532
原创 正则表达式
简单来说,它就像是一种文本模式的“配方”,可以让计真机根据这个“配方” 在文本中找到符合要求的内容。前面我们学习了文件匹配相关的内容,其中在做单词调频统计的时侠,用到了IW+这个内容,当时没有展开来介绍。\\d{9}:\\d代表数字字符(等同于[0-9]),[9]量词修饰,表明需紧接着匹配连续9个数字,对应手机号陈去前两位固定格式外的后续数字部分。[3-9]:字符类设定,限定手机号第二位数字取值在“3”至“9”这个区间内,筛除不符合运营商号段分配起始数字规律的值。1.正则表达式的定义。
2024-12-09 16:12:11
328
原创 Scala 的匹配模式
模式匹配是Scala中非常有特色、非常强大的一种功能,类似于Java中的switch case语法,即对一个值进行条件判断,然后针对不同的条件进行不同的处理。模式匹配属于Scala中的高级特性,在Scala中占有非常重要的地位,Scala程序的源代码中存在大量的模式匹配。其中,value是要进行匹配的值,pattern是匹配模式,guardCondition是守卫条件(一个布尔表达式),result是当该case 分支匹配成功时返回的结果。模式匹配还可以根据元素的个数,元素的特征来匹配。
2024-12-02 16:54:45
1022
原创 Scala 的Array 和 ArrayBuffer 集合
通过Array(Array1,Array2,..,Arrayn)方式可以静态地把数组中的元素定义为数组,例如Array(Array(0,2),Array(3,4))。Scala的Array与Java中的不同点为Scala中的Array可以作为序列使用,通过隐式转换的方式把Scala中的数组转换成序列。下面主要对Array和ArrayBuffer这两种相对应的集合进行介绍,通过可变数组与多维数组的理论知识结合相关案例深入分析Array和ArrayBuffer的应用。第三种方式:利用数组中的方法。
2024-11-20 16:16:18
895
原创 Scala 的List
在集合中添加多个集合元素使用..方式,例如 List(1,2)=11,List(3,4)=12,结合这两个集合可以使用1:12=(1,2,3,4)。Scala中的List 与Java中的完全不同,它是基于链表实现的并且是一个不可变的集合,无论大小还是元素都是不可变的。首先,列表是不可变的,值一旦被定义了就不能改变,其次,列表具有递归的结构(也就是链表结构), 而数组不是。定义List的类型方式为List[T],T表示数据类型,指定List集合中只能存放T类型的元素。2.Scala的List的类型。
2024-11-13 16:10:48
670
原创 Scala 的Map集合
在Scala中,有两种创建Map的方式,分别是Map(k1->v1,k2->v2,..和Map((k1,v1),(k2,v2),...。在Scala中,可以同时使用可变与不可变的Map集合,不可变的直接使用Map,可变的使用mutable.Map。上述创建Map的方式是不可变的, 如果想创建可变的Map,需要导入指定的包,创建方式与不可变的方式相同。Map(映射)是一种可迭代的键值对(Key/Value)结构,所有值都可以通过键来获取,Map中的键都是唯一的。1.Scala的Map的定义。
2024-11-13 15:25:06
1270
原创 Scala 的Set集合
对于不可变集合,它的元素是不可以进行更新操作的,只有可变集合才可以进行元素的更新,使用集合调用update方法可以直接更新元素。一般情况下,对于不可变集合, 使用+方式添加单个或多个元素,使用++方式添加集合,这种操作是父类的通用方法。Scala的Set分为可变的和不可变的,默认情况下使用不可变的集合。下面主要通过Set集合的可变版本和不可变版本的通用方法介绍Set集合的特点和常用操作,通过集合的增加、删除、修改、查询、排序等操作进一步了解Set集合的应用,再结合案例加深对Set集合操作的理解。
2024-11-11 16:20:10
591
原创 Scala 的Set集合与Map集合练习
1.创建一个可变Map,用于存储图书馆中的书籍信息(键为书籍编号,值为包含书籍名称、作者、库存数量的元组),初始化为包含几本你喜欢的书籍信息。4.检查一本特定的书籍(eg:Python从入门到实践)是否在图书馆集合中,使用contains方法,并输出结果。1.创建一个可变Set,用于存储图书馆中的书籍信息(假设书籍信息用字符串表示),初始化为包含几本你喜欢的书籍。4. 修改某本书籍的库存数量(假设可以通过键找到对应的元组并修改其中的值,这里体现可变 Map 的特性)。6.求出两个图书馆集合的并集。
2024-11-11 16:03:33
353
原创 Scala 的包及其导入
通过在Scala文件的顶部声明一个或多个包名称可以创建包,另一种声明包的方式是使用0,这种方式可以嵌套包,并且提供更好的范围与封装控制。对于包的导入,Scala与Java的区别之一便是,Scala可以在任意位置使用import语句。相比于Java中的包,Scala中的包可以定义在文件的开头,也可以在代码的任意位置。Scala中的隐式导入表示每个Scala程序默认都会隐式导入java.lang._和scala. Predef._中的所有成员。下面主要从包的定义、语法以及包的作用域介绍Scala包的相关知识。
2024-11-09 21:47:53
792
原创 Scala 的访问权限
Scala中也有四种访问控制权限,分别为:默认访问权限、protected访问权限、private 访问权限和private[ thisl访问权限。在Java中,访问权限的级别范围由小到大为类、包、继承、all,在Scala中,访问权限的级别范围由小到大为对象、类、继承、 包、all。Scala的控制方法作用域有:默认访问权限、protected访问权限、private访问权限、private[package] 访问权限、private[this]访问权限。(4)private[package]访问权限。
2024-11-06 16:13:30
763
原创 Scala 的trait
当类P中混入类S时,S的位置必须在extends之后,特质A或B不可以与类S互换位置,但是A和B的位置可以互换,例如class P extends S with A with B。下面介绍一个类继承了一个特质后,特质中的成员的处理方式。关于多继承问题,Java中的类不支持多继承,接口支持多实现:而在Scala中trait可以支持多继承,也可以在多继承的同时混入多个特质。在JDK1.7中,Java的接口只能定义一些没实现的方法体和一些赋值的变量,而Scala的trait相当于接口和抽象类的合体。
2024-10-28 16:58:20
1416
原创 Scala 的抽象类与内部类
Scala的成员属性有抽象的和非抽象的,而Java中只有非抽象的。Java中的内部类从属于外类,与Java中内部类不同的是,Scala中的内部类属于对象。下面通过Scala的内部类和匿名类的介绍以及相关案例详细说明Scala的内部类以及匿名类的应用。Scala中的方法可以是抽象的和非抽象的,同样属性也可以是抽象的和非抽象的。Scala的内部类是指定义在类或对象内部的类。与Java相同的是创建在类内部的新类都称为内部类,与Java的不同之处在于Scala中把定义在对象内部的类也称为内部类。
2024-10-23 16:18:59
801
原创 Scala 的继承与多态
从调用父类构造器的语法中可以看出定义类的同时也调用了一个构造器,并通过extends关键字在表明继承关系的同时,也明确了调用类中的哪一个构造器。下面通过介绍方法的继承和方法的重写进一步说明Scala中子类继承父类的特性,结合Scala的多态相关案例详细说明方法的继承和多态。继承就代表子类可以继承父类的特性并且子类可以在自己内部实现类没有的特性,以实现代码的复用和多态特性。关于继承,Java中也有相关概念,Scala中继承的定义为在原有类的基础上定义一个新类,原有类称为父类,新类称为子类。
2024-10-21 16:16:13
1166
原创 Scala的高阶函数
reduce接受两个参数返回一个参数,例如对数组中的所有元素求和,通过调用reduce来实现(1,2,4,3).reduce((x,y)=>(x+y)通过把集合中的第一个元素赋值给x,第二个元素赋值给y,即x=1, y=2,并对这两个值求和。对不变序列的每个元素执行指定的二元规约操作。如果传递的函数的返回值为真,将保留元素中的值,如果为假则过滤元素。假设定义一个数组Arr(1,2,3),通过数组调用map,即Arr(1,2,3).map(x=>x+1),返回值会形成一个新的数组Array(2,3,4)。
2024-10-16 16:44:58
821
原创 Scala 的函数的柯里化
下面介绍Scala函数的柯里化这一特性,柯里化也是函数定义的一种方式。通过柯里化的定义和柯里化函数结合相关案例进行详细介绍。柯里化可以有多个参数列表,例如def a(x:Int(y:Int):Int={x+y}。第一点:不能传递部分参数。在使用柯里化传值时需要传递全部参数,不可以只传递部分参数。第三点:不能返回新的函数。这一点与部分应用函数相对照,稍后将会详细说明。第二点:可以利用隐式参数传递部分值。这一点在介绍隐式转换时会详细说明。使用柯里化的过程中需要注意的地方有三点。2.柯里化的注意要点。
2024-10-14 16:16:05
380
原创 Scala的函数字面量语法
在Scala的函数字面量的定义中直接把参数列表与方法体通过=>相连。由于Scala的函数字面量没有定义函数名,所以又把这种函数字面量称为匿名函数。Scala的函数字面量的简化有两种方式,第一种方式为:_(占位符)。由于Scala的函数字面量没有定义函数名,所以可以通过变量进行调用。另外,也可以通过参数的方式进行调用,关于这种方式的介绍将在Scala的函数高阶中进一步说明,这里不再展开叙述。下面通过Scala的函数字面量定义及作用等相关介绍进一步说明Scala的函数的高级特性。
2024-10-09 19:06:28
338
原创 Scala的函数的链式风格
Scala中的两种链式风格语法分别为this.type和this。如果想要通过链式风格编程定义一个类,并且这个类是不可继承的,那么可以通过方法返回this。如果类是可扩展的,那么可以通过方法返回this.type。链式风格编程并不是Scala中独有的,它在Java等其他编程语言中也是存在的。链式风格并不是一种语法而是一种设计模式,通过一些编程技巧实现链式风格编程。与Java中的调用方法相比,Scala的链式风格代码可读性较好,整体风格简洁。而在Java的调用方式中,一旦对象名出错,容易造成调用出错。
2024-10-09 16:14:20
272
原创 Scala的函数的默认值
传递参数的第二种方式:可以用参数名指定传递参数。当使用第二种方式传递参数时,因为已经指定了变量名,所以并不需要固定参数的前后顺序。只有在没有指定变量名时,参数的前后顺序才需要固定。传递参数的第一种方式:函数使用默认值时可以不传递参数。当函数传递值时会覆盖默认值,如果函数没有传递值,则会取默认值为参数。
2024-10-09 14:56:07
253
原创 Scala覆写equals方法
(1)反射性:在比较对象x和对象y是否相等时,对象x调用equals方法与自身相比时,结果一定返回true,即x.equals(x)的结果是true。(3)过渡性:如果x.equals(y)=true,y.equals(z)=true,那么x.equals(z)=true。(2)对称性:如果x.equals(y)的结果为true,那么y.equals(x)的结果一定也是true。在重写equals方法时,除了需要满足不同的要求之外,还需要符合方法覆写的原则。(1)方法的名字不可以改变。
2024-10-08 20:21:41
347
原创 Scala的对象相等性判断
第19行代码使用eq的方式判断集合11和12 是否相等,由于这两个集合的引用不相等,所以结果返回false。第12行代码使用eq的方式判断对象s1 和s2是否相等,由于eq 比较的是引用,而s1和s2不是同一个引用, 所以结果返回false。Java中的类型分为两大类,一种是基本类型,主要存储的是数值,使用的方判断两个值是否相等,另一种是引用类型,在引用类型中有两种比较方式,第一种方式是使用==比较引用的是否是同一个对象,第二种方式是使用自定义的equals方法比较两个对象的引用是否相等。
2024-10-08 19:51:56
613
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人