Hadoop+Spark大数据技术(微课版)曾国荪、曹洁版 第七章 Spark RDD编程实验

Apache Spark中,`sc` 和 `reduce` 分别代表 SparkContext 和 reduce 函数。

  1. SparkContext (`sc`):是 Spark 的主要入口点,它代表与 Spark 集群的连接。
    在 Spark 应用程序中,需要首先创建一个 SparkContext 对象,负责与集群通信并管理资源。通过 SparkContext,可以创建 RDDs(Resilient Distributed Datasets)、Broadcast Variables、Accumulators 等。
  2. Reduce 函数:在分布式计算中,reduce 函数是一个用于聚合数据的操作。
    在 Spark 中,reduce 函数通常用于对 RDD(Resilient Distributed Dataset)中的元素执行聚合操作。
    接受一个函数作为参数,函数定义了如何将两个元素聚合成一个新元素。
    reduce 函数会在集群中的多个节点上并行执行,并在最后将结果聚合起来。
    常见的用例包括对数字进行求和、查找最大值或最小值等。

使用文本文件创建RDD

注意:需要先在hadoop分布式文件系统中创建文件

1.先在本地文件系统创建data.txt文件

cd /usr/local/hadoop/input

gedit data.txt

2.启动hadoop分布式文件系统

./sbin/start-dfs.sh

3.上传本地文件data.txt到hadoop分布式文件系统

hdfs dfs -put /usr/local/hadoop/input/data.txt input

查看分布式文件系统中是否存在data.txt

hdfs dfs -ls input

textFile 函数用于读取文本文件中的内容,并将其转换为RDD。

rdd.map(line => line.length):这一行代码将每一行文本映射为其长度,即字符数。

.map()函数对RDD中的每个元素应用给定的函数,并返回结果组成的新RDD。

.reduce(_ + _):这一行代码对RDD中的所有元素进行累加,得到它们的总和。.reduce()函数将RDD中的元素两两合并,直到只剩下一个元素,这里使用的匿名函数 _ + _ 表示将两个元素相加。

val wordCount = rdd.map(line => line.length).reduce(_ + _):这行代码将文本文件中所有行的字符数求和,并将结果保存在wordCount变量中。

wordCount:最后,wordCount 变量中保存着文本文件中所有行的字符总数。

Scala 复制代码
val rdd = sc.textFile("/user/hadoop/input/data.txt")
rdd: org.apache.spark.rdd.RDD[String] = /user/hadoop/input/data.txt MapPartitionsRDD[31] at textFile at <console>:25

val wordCount = rdd.map(line => line.length).reduce(_ + _)
wordCount

wordCount: Int = 274
res11: Int = 274

一些JSON数据

{

"name": "中国",

"province": [

{

"name": "河南",

"cities": [

{

"city": ["郑州","洛阳"]

]

}

]

}

```

{

"code": 0,

"msg": "",

"count": 2,

"data": [

{

"id": 101,

"username": "zhangsan",

"city": "xiamen"

},

{

"id": 102,

"username": "liming",

"city": "zhengzhou"

}

]

}

{"学号":"106","姓名":"李明","数据结构":"92"}

{"学号":"242","姓名":"李乐","数据结构":"93"}

{"学号":"107","姓名":"冯涛","数据结构":"99"}

完整程序练习

seq是一个包含元组的列表,每个元组都有一个字符串键和一个字符串列表值。

sc.parallelize方法将seq转换为一个RDD。

rddP.partitions.size是用来获取RDD的分区数量的。RDD的分区是数据的逻辑划分,决定了数据在集群中的分布方式。每个分区都可以在集群的不同节点上进行并行处理。

Scala 复制代码
//使用程序中的数据创建RDD

val arr = Array(1,2,3,4,5,6)

val rdd = Array(1,2,3,4,5,6)

arr: Array[Int] = Array(1, 2, 3, 4, 5, 6)
rdd: Array[Int] = Array(1, 2, 3, 4, 5, 6)

val sum = rdd.reduce(_ + _)

sum: Int = 21

//parallelize() 创建RDD

val seq = List( ("num", List("one","two","three") ), ("study",List("Scala","Python","Hadoop")) , ("color", List("blue","white","black")) )

val rddP = sc.parallelize(seq)   

rddp.partitions.size

seq: List[(String, List[String])] = List((num,List(one, two, three)), (study,List(Scala, Python, Hadoop)), (color,List(blue, white, black)))
rddP: org.apache.spark.rdd.RDD[(String, List[String])] = ParallelCollectionRDD[7] at parallelize at <console>:31
res5: Int = 2

//makeRDD() 创建RDD

val rddM = sc.makeRDD(seq)

rddM.partitions.size

rddM: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[8] at makeRDD at <console>:30
res6: Int = 3

//hdfs的文件创建RDD

val rdd = sc.textFile("/user/hadoop/input/data.txt")

rdd: org.apache.spark.rdd.RDD[String] = /user/hadoop/input/data.txt MapPartitionsRDD[31] at textFile at <console>:25

val wordCount = rdd.map(line => line.length).reduce(_ + _)

wordCount

wordCount: Int = 274
res11: Int = 274

//本地文件创建RDD

val rdd = sc.textFile("file:/home/hadoop/data.txt")

val wordCount = rdd.map(line => line.length).reduce(_ + _)

wordCount

rdd: org.apache.spark.rdd.RDD[String] = file:/home/hadoop/data.txt MapPartitionsRDD[34] at textFile at <console>:29
wordCount: Int = 274
res12: Int = 274

val rddw1 = sc.textFile("file:/home/hadoop/input")

rddw1.collect()

rddw1: org.apache.spark.rdd.RDD[String] = file:/home/hadoop/input MapPartitionsRDD[37] at textFile at <console>:25
res13: Array[String] = Array(Hello Spark!, Hello Scala!)

val rddw1 = sc.wholeTextFiles("file:/home/hadoop/input")

rddw1.collect()

rddw1: org.apache.spark.rdd.RDD[(String, String)] = file:/home/hadoop/input MapPartitionsRDD[39] at wholeTextFiles at <console>:27
res14: Array[(String, String)] =
Array((file:/home/hadoop/input/text1.txt,"Hello Spark!
"), (file:/home/hadoop/input/text2.txt,"Hello Scala!
"))

val jsonStr = sc.textFile("file:/home/hadoop/student.json")

jsonStr.collect()

jsonStr: org.apache.spark.rdd.RDD[String] = file:/home/hadoop/student.json MapPartitionsRDD[48] at textFile at <console>:28
res18: Array[String] = Array({"学号":"106","姓名":"李明","数据结构":"92"}, {"学号":"242","姓名":"李乐","数据结构":"93"}, {"学号":"107","姓名":"冯涛","数据结构":"99"})

import scala.util.parsing.json.JSON

val jsonStr = sc.textFile("file:/home/hadoop/student.json")

val result  = jsonStr.map(s => JSON.parseFull(s))

result.foreach(println)

Some(Map(学号 -> 107, 姓名 -> 冯涛, 数据结构 -> 99))
Some(Map(学号 -> 106, 姓名 -> 李明, 数据结构 -> 92))
Some(Map(学号 -> 242, 姓名 -> 李乐, 数据结构 -> 93))

import scala.util.parsing.json.JSON
jsonStr: org.apache.spark.rdd.RDD[String] = file:/home/hadoop/student.json MapPartitionsRDD[50] at textFile at <console>:31
result: org.apache.spark.rdd.RDD[Option[Any]] = MapPartitionsRDD[51] at map at <console>:32

import java.io.StringReader

import au.com.bytecode.opencsv.CSVReader

val gradeRDD = sc.textFile("file:/home/hadoop/sparkdata/grade.csv")

val result = gradeRDD.map{line => val reader = new CSVReader(new StringReader(line));reader.readNext()}

result.collect().foreach(x => println(x(0),x(1),x(2)))

(101,LiNing,95)
(102,LiuTao,90)
(103,WangFei,96)

import java.io.StringReader
import au.com.bytecode.opencsv.CSVReader
gradeRDD: org.apache.spark.rdd.RDD[String] = file:/home/hadoop/sparkdata/grade.csv MapPartitionsRDD[53] at textFile at <console>:31
result: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[54] at map at <console>:32
相关推荐
Json_1817901448035 分钟前
An In-depth Look into the 1688 Product Details Data API Interface
大数据·json
lzhlizihang1 小时前
【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)
spark·standalone模式·spark集群搭建
Qspace丨轻空间3 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
Elastic 中国社区官方博客4 小时前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
Aloudata5 小时前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
水豚AI课代表5 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
拓端研究室TRL8 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗8 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
编码小袁8 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
WeeJot嵌入式9 小时前
大数据治理:确保数据的可持续性和价值
大数据