寒假学习进度4
今天开始学习spark3大数据结构中的RDD
什么是RDD:
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据
处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行
计算的集合。
RDD有5大核心属性:
*-A list of partitions(分区列表用于执行任务时并行计算)
*一 A function for computing each split*(分区计算函数,每个分区的数据计算)
-A list of dependencies on other RDDs(RDD 之间的依赖关系)
*- Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)(,分区器,分区器自定义数据的分区)
- Optionally, a list of preferred locations to compute each split on (e.g. block locations for水an HDFS file)(首选位置,可以根据计算节点的状态选择不同的节点位置进行计算)
RDD的创建:
(1)从集合(内存)中创建 RDD
def main(args: Array[String]): Unit = {
//准备环境
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")
val sparkContext = new SparkContext(sparkConf)
//内存中创建rdd,内存中存储的数据作为数据源
//parallelize:并行
val rdd1 = sparkContext.parallelize(
List(1,2,3,4)
)
//从底层代码实现来讲,makeRDD 方法其实就是 parallelize 方法
val rdd2 = sparkContext.makeRDD(
List(1,2,3,4)
)
rdd1.collect().foreach(println)
rdd2.collect().foreach(println)
//关闭环境
sparkContext.stop()
}
(2)从外部存储(文件)创建 RDD
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")
val sparkContext = new SparkContext(sparkConf)
//spark读取文件操作底层代码就是使用hadoop的读取方式
//第二个参数可以指定最小分区数
val fileRDD: RDD[String] = sparkContext.textFile("data",2)
//path路径可以使用通配符*
// val fileRDD: RDD[String] = sparkContext.textFile("data/1*.txt")
//分布式系统路径
// val fileRDD: RDD[String] = sparkContext.textFile("hdfs://hadoop102:8020/test")
fileRDD.collect().foreach(println)
sparkContext.stop()
}
RDD 并行度与分区:(数据分区后的数据分配问题篇幅过于长,详情见尚硅谷spark教程p35-p39)
def main(args: Array[String]): Unit = {
//准备环境
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")
val sparkContext = new SparkContext(sparkConf)
//rdd的并行和分区,第二个参数可以指定分区数
val dataRDD: RDD[Int] = sparkContext.makeRDD(
List(1,2,3,4),4)
//文件分区后进行输入在output目录下
dataRDD.saveAsTextFile("output")
sparkContext.stop()
//关闭环境
sparkContext.stop()
}
//spark读取文件操作底层代码就是使用hadoop的读取方式