RDD用法
1. 基础编程
1.1 RDD创建
- 在Spark中创建RDD的创建方式可以分为四种:
1.1.1 从集合(内存)中创建RDD
-
从集合中创建RDD,Spark主要提供了两个方法:parallelize和makeRDD
val sparkConf =new SparkConf().setMaster("local[*]").setAppName("spark") val sparkContext = new SparkContext(sparkConf) val rdd1 = sparkContext.parallelize( List(1,2,3,4) ) val rdd2 = sparkContext.makeRDD( List(1,2,3,4) ) rdd1.collect().foreach(println) rdd2.collect().foreach(println) sparkContext.stop()
1.1.2 从外部存储(文件)创建RDD
-
由外部存储系统的数据集创建RDD包括:本地的文件系统,所有Hadoop支持的数据集,比如HDFS、HBase等。
val sparkConf =new SparkConf().setMaster("local[*]").setAppName("spark") val sparkContext = new SparkContext(sparkConf) val fileRDD: RDD[String] = sparkContext.textFile("input") fileRDD.collect().foreach(println) sparkContext.stop()
1.1.3 从其他RDD创建
- 主要是通过一个RDD运算完后,再产生新的RDD。
1.1.4 直接创建RDD
- 使用new的方式直接构造RDD,一般由Spark框架自身使用。
2.2 RDD并行度与分区
2.2.1 概述
-
默认情况下,Spark可以将一个作业切分多个任务后,发送给Executor节点并行计算,而能够并行计算的任务数量我们称之为并行度。这个数量可以在构建RDD时指定。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4X3lmpN-1655396045045)(assets/1650985766986.png)]
2.2.2 分区
val conf = new SparkConf().setMaster("local[*]").setAppName("RDD")
conf.set("spark.default.parallelism", "4")
val sc = new SparkContext(conf)
// TODO 从内存中创建RDD - 分区
// 1. 如果构建RDD时,没有指定数据处理分区的数量,那么会使用默认分区数量
// makeRDD方法存在第二个参数,这个参数表示分区数量numSlices(存在默认值)
// scheduler.conf.getInt("spark.default.parallelism", totalCores)
// totalCores : 当前Master环境的总(虚拟)核数
// 分区设置的优先级 : 方法参数 > 配置参数 > 环境配置
// kafka生产者分区策略
// 【1,3,5】【2,4】 : 轮询
// 【1,2, 3】【5,4】 :范围
// 【1,2】【3,4】【5】 :范围
// Spark分区策略
// 【1,2】【3,4,5】 :范围
// 【1】【2,3】【4,5】:范围
val rdd1 : RDD[Int] = sc.makeRDD(
Seq(1,2,3,4,5), 3
)
// saveAsTextFile方法可以生成分区文件
rdd1.saveAsTextFile("output")
sc.stop()
3.3 RDD转换算子
3.3.1 概述
- RDD根据数据处理方式的不同将算子整体上分为Value类型、双Value类型和Key-Value类型
3.3.2 map方法
-
函数签名
def map[U: ClassTag](f: T => U): RDD[U]
-
函数说明
- 将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以是值的转换。
-
用法
package com.gec.bigdata.spark.rdd.operator.transform import org.apache.spark.rdd.RDD import org.apache.spark.{ SparkConf