Spark之RDD操作编程-Java篇(二)

本文深入解析Spark中RDD(弹性分布式数据集)的基本概念,包括创建、转换、行动及控制操作,阐述了如何通过不同操作实现数据处理,是Spark开发者入门及进阶的必备指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RDD 介绍

RDD,全称Resilient Distributed Datasets(弹性分布式数据集),是Spark最为核心的概念,是Spark对数据的抽象。RDD是分布式的元素集合,每个RDD只支持读操作,且每个RDD都被分为多个分区存储到集群的不同节点上。除此之外,RDD还允许用户显示的指定数据存储到内存和磁盘中,掌握了RDD编程是SPARK开发的第一步。

1:创建操作(creation operation):RDD的创建由SparkContext来负责。
2:转换操作(transformation operation):将一个RDD通过一定操作转换为另一个RDD。
3:行动操作(action operation):Spark为惰性计算,对RDD的行动操作都会触发Spark作业的运行
4:控制操作(control operation):对RDD进行持久化等。

一:创建操作

创建RDD有两种方式:
1 读取一个数据集(SparkContext.textFile()) :

JavaDStreamlines=jssc.textFileStream("E:/spark/input/"); 
JavaReceiverInputDStreamlines = jssc.socketTextStream("localhost", 9999);
2 读取一个集合(SparkContext.parallelize()) :

Listlist = Arrays.asList(5, 4, 3, 2, 1);
JavaRDDrdd = sc.parallelize(list);

二:转换操作

1:单个RDD转换操作

map() : 对每个元素进行操作,返回一个新的RDD
System.out.println("RDD每个元素乘10:" + rdd.map(v -> v * 10)
filter() : 最每个元素进行筛选,返回符合条件的元素组成的一个新RDD
System.out.println("RDD去掉1的元素:" + rdd.filter(v -> v != 1));

flatMap() : 对每个元素进行操作,将返回的迭代器的所有元素组成一个新的RDD返回
r.dd.flatMap(x -> x.to(3)).collect()

distinct():去重操作
System.out.println("RDD去重操作:" + rdd.distinct());

rdd最大和最小值

Integer max=  rdd.reduce((v1, v2) -> Math.max(v1, v2));

Integer min=  rdd.reduce((v1, v2) -> Math.min(v1, v2))


2:两个RDD的转化操作:

[1, 2, 3] [3, 4, 5] 两个个RDD简单相关操作

union() :合并,不去重
System.out.println("两个RDD集合:" + rdd1.union(rdd2).collect());

intersection() :交集
System.out.println("两个RDD集合共同元素:" + rdd1.intersection(rdd2).collect());

cartesian() :笛卡儿积
System.out.println("和另外一个RDD集合的笛卡尔积:" + rdd1.cartesian(rdd2).collect());

subtract() : 移除相同的内容
rdd1.subtract(rdd2).collect()

三:行动操作

collect() :返回所有元素
System.out.println("原始数据:" + rdd.collect());

count() :返回元素个数
System.out.println("统计RDD的所有元素:" + rdd.count());

countByValue() : 各个元素出现的次数
System.out.println("每个元素出现的次数:" + rdd.countByValue());

take(num) : 返回num个元素
System.out.println("取出rdd返回2个元素:" + rdd.take(2));

top(num) : 返回前num个元素
System.out.println("取出rdd返回最前2个元素:" + rdd.top(2));
reduce(func) :并行整合RDD中的所有数据(最常用的)
System.out.println("整合RDD中所有数据(sum):" + rdd.reduce((v1, v2) -> v1 + v2));

foreach(func):对每个元素使用func
rdd.foreach(t -> System.out.print(t));

四:控制操作

cache():

persist():保留着RDD的依赖关系

checkpoint(level:StorageLevel):RDD[T]切断RDD依赖关系

所谓的控制操作就是持久化
你能通过persist()或者cache()方法持久化一个rdd。首先,在action中计算得到rdd;然后,将其保存在每个节点的内存中。Spark的缓存是一个容错的技术-如果RDD的任何一个分区丢失,它 可以通过原有的转换(transformations)操作自动的重复计算并且创建出这个分区。
此外,我们可以利用不同的存储级别存储每一个被持久化的RDD。
Spark自动的监控每个节点缓存的使用情况,利用最近最少使用原则删除老旧的数据。如果你想手动的删除RDD,可以使用RDD.unpersist()方法。
在实际操作当中我们可以借助第三方进行数据持久化 如:redis

### Spark算子在Java中的综合案例教程 Spark 是一个分布式计算框架,支持多种编程语言,包括 Java。以下是一个关于 Spark 算子的 Java 综合案例教程,涵盖了常见的 RDD 操作和数据处理流程。 #### 1. 初始化 Spark 环境 在使用 Spark 算子之前,需要初始化 Spark 环境。以下是创建 SparkConf 和 JavaSparkContext 的代码示例[^2]: ```java import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; public class SparkInitializer { public static JavaSparkContext initialize() { SparkConf conf = new SparkConf().setAppName("JavaSparkExample").setMaster("local[*]"); return new JavaSparkContext(conf); } } ``` #### 2. 数据加载与转换 假设有一个文本文件 `data.txt`,包含多行字符串数据。可以使用 `textFile` 方法加载数据,并通过算子进行转换[^3]: ```java import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; public class DataLoadingAndTransformation { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); JavaRDD<String> lines = sc.textFile("data.txt"); // 使用 map 算子对每行数据进行处理 JavaRDD<Integer> wordLengths = lines.map(line -> line.split(" ").length); // 使用 filter 算子过滤出长度大于 5 的行 JavaRDD<String> longLines = lines.filter(line -> line.length() > 5); System.out.println("Word lengths: " + wordLengths.collect()); System.out.println("Long lines: " + longLines.collect()); sc.close(); } } ``` #### 3. 聚合操作 Spark 提供了丰富的聚合操作,例如 `reduce` 和 `fold`。以下是一个统计总单词数的示例[^4]: ```java import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.Function2; public class AggregationExample { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); JavaRDD<String> lines = sc.textFile("data.txt"); // 将每行分割为单词,并展平为单个 RDD JavaRDD<String> words = lines.flatMap(line -> java.util.Arrays.asList(line.split(" ")).iterator()); // 使用 reduce 算子统计总单词数 long totalWords = words.count(); System.out.println("Total words: " + totalWords); sc.close(); } } ``` #### 4. 键值对操作 对于键值对数据,可以使用 `JavaPairRDD` 进行操作。以下是一个按单词计数的示例[^5]: ```java import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; public class KeyValueOperations { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); JavaRDD<String> lines = sc.textFile("data.txt"); // 将每行分割为单词,并映射为键值对 (word, 1) JavaPairRDD<String, Integer> wordPairs = lines.flatMap(line -> java.util.Arrays.asList(line.split(" ")).iterator()) .mapToPair(word -> new Tuple2<>(word, 1)); // 使用 reduceByKey 算子统计每个单词的出现次数 JavaPairRDD<String, Integer> wordCounts = wordPairs.reduceByKey((a, b) -> a + b); System.out.println("Word counts: " + wordCounts.collect()); sc.close(); } } ``` #### 5. 高级算子 除了基本的算子外,Spark 还提供了许多高级算子,如 `join`、`groupByKey` 和 `cogroup`。以下是一个简单的 `join` 示例[^6]: ```java import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; public class AdvancedOperators { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); // 创建两个键值对 RDD JavaPairRDD<String, Integer> rdd1 = sc.parallelizePairs(java.util.Arrays.asList( new Tuple2<>("a", 1), new Tuple2<>("b", 2), new Tuple2<>("c", 3))); JavaPairRDD<String, String> rdd2 = sc.parallelizePairs(java.util.Arrays.asList( new Tuple2<>("a", "x"), new Tuple2<>("b", "y"), new Tuple2<>("d", "z"))); // 使用 join 算子合并两个 RDD JavaPairRDD<String, Tuple2<Integer, String>> joined = rdd1.join(rdd2); System.out.println("Joined RDD: " + joined.collect()); sc.close(); } } ``` ### 总结 上述案例展示了如何在 Java 中使用 Spark 算子进行数据加载、转换、聚合以及键值对操作。这些算子是 Spark 的核心功能,适用于各种复杂的数据处理任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值