该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/FArNP】
(1)Spark Shell里实现
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>cn.kox.rddgroupId>
<artifactId>SparkRDDDemoartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.scala-langgroupId>
<artifactId>scala-libraryartifactId>
<version>2.12.15version>
dependency>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-core_2.12artifactId>
<version>3.1.3version>
dependency>
dependencies>
<build>
<sourceDirectory>src/main/scalasourceDirectory>
build>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
project>
log4j.rootLogger=ERROR, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/rdd.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
<configuration>
<property>
<description>only config in clientsdescription>
<name>dfs.client.use.datanode.hostnamename>
<value>truevalue>
property>
configuration>
package cn.kox.rdd.day01
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.ListBuffer
import scala.io.StdIn
/**
* @ClassName: Example01
* @Author: Kox
* @Data: 2023/6/12
* @Sketch:
*/
object Example01 {
def main(args: Array[String]): Unit = {
// 创建Spark配置对象
val conf = new SparkConf()
.setAppName("PrintDiamond") // 设置应用名称
.setMaster("local[*]") // 设置主节点位置(本地调试)
// 基于Spark配置对象创建Spark容器
val sc = new SparkContext(conf)
// 输入一个奇数
print("输入一个奇数:")
val n = StdIn.readInt()
//判断n的奇偶性
if (n % 2 == 0) {
println("温馨提示:你输入的不是奇数")
return
}
// 创建一个可变列表
val list = new ListBuffer[Int]()
// 给列表赋值
(1 to n by 2).foreach(list.append(_))
(n - 2 to 1 by -2).foreach(list.append(_))
// 基于列表创建rdd
val rdd = sc.makeRDD(list)
// 对rdd进行映射操作
val rdd1 = rdd.map(i => " " * ((n - i) / 2) + "*" * i)
// 输出rdd1结果
rdd1.collect.foreach(println)
}
}
/park/words.txt
内容val lines= sc.textFile("/park/words.txt")
,读取文件 /park/words.txt
生成RDD - lines
val sparkLines = lines.filter(_.contains("spark"))
,过滤包含spark的行生成RDD - sparkLines
sparkLines.collect
,查看sparkLines
内容,可以采用遍历算子,分行输出内容package cn.kox.rdd.day01
import org.apache.spark.{SparkConf, SparkContext}
/**
* @ClassName: Example02
* @Author: Kox
* @Data: 2023/6/12
* @Sketch:
*/
object Example02 {
def main(args: Array[String]): Unit = {
// 创建不规则二维列表
val mat = List(
List(7, 8, 1, 5),
List(10, 4, 9),
List(7, 2, 8, 1, 4),
List(21, 4, 7, -4)
)
// 输出二维列表
println(mat)
// 将二维列表扁平化为一维列表
val arr = mat.flatten
// 输出一维列表
println(arr)
// 输出元素个数
println("元素个数:" + arr.size)
}
}
cn.kox.rdd.day01
包里创建Example03
单例对象package cn.kox.rdd.day01
import org.apache.spark.{SparkConf, SparkContext}
/**
* @ClassName: Example03
* @Author: Kox
* @Data: 2023/6/12
* @Sketch:
*/
object Example03 {
def main(args: Array[String]): Unit = {
// 创建Spark配置对象
val conf = new SparkConf()
.setAppName("PrintDiamond") // 设置应用名称
.setMaster("local[*]") // 设置主节点位置(本地调试)
// 基于Spark配置对象创建Spark容器
val sc = new SparkContext(conf)
// 创建不规则二维列表
val mat = List(
List(7, 8, 1, 5),
List(10, 4, 9),
List(7, 2, 8, 1, 4),
List(21, 4, 7, -4)
)
// 基于二维列表创建rdd1
val rdd1 = sc.makeRDD(mat)
// 输出rdd1
rdd1.collect.foreach(x => print(x + " "))
println()
// 进行扁平化映射
val rdd2 = rdd1.flatMap(x => x.toString.substring(5, x.toString.length - 1).split(", "))
// 输出rdd2
rdd2.collect.foreach(x => print(x + " "))
println()
// 输出元素个数
println("元素个数:" + rdd2.count)
}
}
val scores = List(("张钦林", 78), ("张钦林", 90), ("张钦林", 76),
("陈燕文", 95), ("陈燕文", 88), ("陈燕文", 98),
("卢志刚", 78), ("卢志刚", 80), ("卢志刚", 60))
val rdd1 = sc.makeRDD(scores)
val rdd2 = rdd1.reduceByKey((x, y) => x + y)
rdd2.collect.foreach(println)
package cn.kox.rdd.day02
import org.apache.spark.{SparkConf, SparkContext}
/**
* @ClassName: CalculateScoreSum01
* @Author: Kox
* @Data: 2023/6/12
* @Sketch:
*/
object CalculateScoreSum01 {
def main(args: Array[String]): Unit = {
// 创建Spark配置对象
val conf = new SparkConf()
.setAppName("PrintDiamond") // 设置应用名称
.setMaster("local[*]") // 设置主节点位置(本地调试)
// 基于Spark配置对象创建Spark容器
val sc = new SparkContext(conf)
// 创建二元组成绩列表
val scores = List(
("张钦林", 78), ("张钦林", 90), ("张钦林", 76),
("陈燕文", 95), ("陈燕文", 88), ("陈燕文", 98),
("卢志刚", 78), ("卢志刚", 80), ("卢志刚", 60))
// 基于二元组成绩列表创建RDD
val rdd1 = sc.makeRDD(scores)
// 对成绩RDD进行按键归约处理
val rdd2 = rdd1.reduceByKey(_ + _)
// 输出归约处理结果
rdd2.collect.foreach(println)
}
}
package cn.kox.rdd.day02
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.ListBuffer
/**
* @ClassName: CalculateScoreSum02
* @Author: Kox
* @Data: 2023/6/12
* @Sketch:
*/
object CalculateScoreSum02 {
def main(args: Array[String]): Unit = {
// 创建Spark配置对象
val conf = new SparkConf()
.setAppName("PrintDiamond") // 设置应用名称
.setMaster("local[*]") // 设置主节点位置(本地调试)
// 基于Spark配置对象创建Spark容器
val sc = new SparkContext(conf)
// 创建四元组成绩列表
val scores = List(
("张钦林", 78, 90, 76),
("陈燕文", 95, 88, 98),
("卢志刚", 78, 80, 60)
)
// 将四元组成绩列表转化成二元组成绩列表
val newScores = new ListBuffer[(String, Int)]()
// 通过遍历算子遍历四元组成绩列表
scores.foreach(score => {
newScores.append(Tuple2(score._1, score._2))
newScores.append(Tuple2(score._1, score._3))
newScores.append(Tuple2(score._1, score._4))
}
)
// 基于二元组成绩列表创建RDD
val rdd1 = sc.makeRDD(newScores)
// 对成绩RDD进行按键归约处理
val rdd2 = rdd1.reduceByKey(_ + _)
// 输出归约处理结果
rdd2.collect.foreach(println)
}
}
192.168.234.21
192.168.234.22
192.168.234.21
192.168.234.21
192.168.234.23
192.168.234.21
192.168.234.21
192.168.234.21
192.168.234.25
192.168.234.21
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.29
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.25
192.168.234.25
192.168.234.21
192.168.234.22
192.168.234.21
package cn.kox.rdd.day03
import org.apache.spark.{SparkConf, SparkContext}
/**
* @ClassName: DistinctIPs
* @Author: Kox
* @Data: 2023/6/12
* @Sketch:
*/
object DistinctIPs {
def main(args: Array[String]): Unit = {
// 创建Spark配置对象
val conf = new SparkConf()
.setAppName("DistinctIPs ") // 设置应用名称
.setMaster("local[*]") // 设置主节点位置(本地调试)
// 基于Spark配置对象创建Spark容器
val sc = new SparkContext(conf)
// 读取本地IP地址文件,得到RDD
val ips = sc.textFile("D:\\Major\\BigData\\Spark\\SparkLesson2023U\\SparkRDDDemo\\ips.txt")
// rdd去重再输出
ips.distinct.collect.foreach(println)
}
}