寒假学习进度5

今天开始学习spark中RDD算子

首先是Value类型

(1)map

练习代码:

def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sparkContext = new SparkContext(sparkConf)
//算子(转换)
val rdd=sparkContext.makeRDD(List(1,2,3,4))

//转换函数
// val dataRDD1: RDD[Int] = rdd.map(
// (num:Int) => {
// num * 2
// } )(完整形式)
val dataRDD1: RDD[Int] = rdd.map(
num => {
num * 2
} )
// val dataRDD2: RDD[String] = dataRDD1.map(
// num => {
// "" + num
// } )
dataRDD1.collect().foreach(println)
sparkContext.stop()
}
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sparkContext = new SparkContext(sparkConf)
val rdd=sparkContext.textFile("data/apache.log")

//apache.log文件中每一行的路径属性取出来,用空格为分隔,将每一行字符串分成成多个组,文件属性在第6
val mapRDD: RDD[String] = rdd.map(
line => {
val datas = line.split(" ")
datas(6)
}
)
mapRDD.collect().foreach(println)
sparkContext.stop()
}

(2)mapPartitions

def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sparkContext = new SparkContext(sparkConf)
val rdd=sparkContext.makeRDD(List(1,2,3,4),2)
//性能比.map要好,一次性拿一个分区的数据,进行转换操作,但处理完的数据不会释放掉,因为有对象的引用,容易出现内存溢出。
val maprdd: RDD[Int] = rdd.mapPartitions(
iter => {
iter.map(_ * 2)
}
)

maprdd.collect().foreach(println)
sparkContext.stop()
}
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sparkContext = new SparkContext(sparkConf)
val rdd=sparkContext.makeRDD(List(1,2,3,4),2)
//计算每个分区中的最大值
val maprdd: RDD[Int] = rdd.mapPartitions(
iter => {
List(iter.max).iterator
}
)

maprdd.collect().foreach(println)
sparkContext.stop()
}

mapPartitions在处理效率上出map要高,但容易出现内存溢出。mapPartitions可以增加或减少数据,map不行。总的来说在内存有限的情况下,使用map较好。

(3)mapPartitionsWithIndex

def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator1")
val sparkContext = new SparkContext(sparkConf)

val rdd: RDD[Int] = sparkContext.makeRDD(List(1,2,3,4), 2)

//将分区后进行编号,然后索引,当为编号为1的分区是返回这个迭代器,输入它
val maprdd = rdd.mapPartitionsWithIndex(
(index, iter) => {
if (index == 1) {
iter
} else {
Nil.iterator
}

}
)

maprdd.collect().foreach(println)

sparkContext.stop()
}
posted @   chenghaixinag  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示