目录
1.RDD 介绍
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合,RDD算子分为转换(Transformation)算子和行动( Action)算子,程序运行到转换算子时并不会马上执行转算子,只有碰到行动算子才会真正执行转换算子。
2.RDD 创建
创建RDD一般有三种方式:
通过集合创建RDD:使用SparkContext.parallelize方法将集合转成RDD。
通过文件创建RDD:使用SparkContext.textFile方法读取文件内容创建RDD,文件可以是本地文件,也可以是hdfs文件。
通过其他RDD创建RDD,RDD的内容是不可变的,通过RDD算子操作之后会生产新的RDD。
4.创建RDD
5、从外部文件创建 RDD
val rdd = sc.textFile("file.txt")
1.RDD 常用转换算子
1、map算子
map算子:对输入的每一元素进行处理,生成一对一的结果,有多少条数据进入,就有多少数据出来。
2、filter算子
根据给定的函数过滤 RDD 中的元素,并返回一个包含满足条件的元素的新 RDD。
3、flatMap算子
类似于 map,但是对每个输入元素生成多个输出元素(返回一个扁平化的结果)。
4、mapPartitions算子
类似于 map,但是作用于 RDD 的每个分区而不是每个元素,可以减少开销。
5、distinct算子
去除 RDD 中的重复元素,并返回一个包含唯一元素的新 RDD。
6、dsortBy算子
根据给定的比较函数对 RDD 中的元素进行排序。
2、RDD 常用转换算子
1、collect行动算子
将 RDD 中的所有元素收集到驱动程序节点上,并以数组的形式返回。
2、count行动算子
返回 RDD 中元素的数量
val hf_count = hf_rdd.count()
3、reduce行动算子
通过一个函数将 RDD 中的元素两两结合,直到将所有元素归约为一个结果。
4、take行动算子
二、SparDataFrame入门
DataFrame是一个二维表结构,那么表格结构就有无法绕开的三个点:
行
列
表结构描述
在MySQL中的一张表:
由许多行组成
数据也被分成多个列
表也有表结构信息(列、列名、列类型、列约束等)
基于这个前提,DataFrame的组成如下:
在结构层面:
StructType对象描述整个DataFrame的表结构
StructField对象描述一个列的信息
在数据层面
Row对象记录一行数据
Column对象记录一列数据并包含列的信息
二、SparDataFrame入门
DataFrame是一个二维表结构,那么表格结构就有无法绕开的三个点:
行
列
表结构描述
在MySQL中的一张表:
由许多行组成
数据也被分成多个列
表也有表结构信息(列、列名、列类型、列约束等)
基于这个前提,DataFrame的组成如下:
在结构层面:
StructType对象描述整个DataFrame的表结构
StructField对象描述一个列的信息
在数据层面
Row对象记录一行数据
Column对象记录一列数据并包含列的信息
创建RDD
package com.tipdm.sparkDemo
import org.apache.spark.{SparkConf, SparkContext}
object a1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(conf)
val rdd1 = sc.parallelize(List(('a',1),('b',99),('c',100),('d',101)))
val rdd2 = sc.parallelize(List(('e',120),('f',150)))
val rdd3 = rdd1.union(rdd2)
rdd3.filter(_._2 >= 100).collect
rdd3.filter(x => x._2 >= 100).collect.foreach(println)
val rdd4 = sc.parallelize(List(('a',1),('b',99),('c',100),('d',101),('c',100)))
rdd4.filter(_._2 >= 100).collect
val rdd5 = rdd4.distinct()
rdd5.filter(x => x._2 >= 100).collect.foreach(println)
}
}
创建rdd1与rdd2,用union()方法合并rdd1与rdd2放在rdd3中
对rdd3进行filter()方法过滤,去除100以下的数据
创建rdd4,先用filter()方法过滤去除100以下的数据,再用distinct()方法去重输出
object a2 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(conf)
val rdd1 = sc.parallelize(List(1,2,3))
val rdd2 = sc.parallelize(List(3,4,5,6))
val rdd3 = sc.parallelize(List('a','b','c'))
val rdd4 = rdd1.union(rdd2)
val rdd5 = rdd4.filter(_ >= 3)
val rdd6 = rdd5.distinct()
rdd6.cartesian(rdd3).collect.foreach(println)
}
}
创建rdd1与rdd2,用union()方法合并rdd1与rdd2放在rdd4中
创建rdd5,用filter()方法过滤去除3以下的数据
创建rdd6,先用distinct()方法去再用cartesian()方法输出笛卡尔积
2、从外部数据源创建 DataFrame
3、显示 DataFrame 的内容
过滤行
分组聚合
添加和删除列
使用 SQL 查询
在本文中,我们探讨了 Spark 中两个重要的数据抽象:Spark RDD 和 Spark DataFrame。Spark RDD 是最初引入的分布式数据集概念,它提供了对数据的低级别控制和操作。它适用于需要对数据进行精细控制的情况,例如复杂的数据处理和算法实现。
与此相比,Spark DataFrame 是在 Spark SQL 中引入的,它提供了更高级别、更方便的 API,使得数据处理更加直观和简单。它更适用于结构化数据和 SQL 操作,以及大规模数据的数据处理和分析。
选择使用哪种数据结构取决于具体的需求和情况。如果你需要对数据进行更复杂的转换和操作,并且对数据的结构不是很了解,那么 Spark DataFrame 可能更适合你。而如果你需要对数据进行更底层的控制,并且更关注性能和灵活性,那么 Spark RDD 可能是更好的选择。
无论你选择使用哪种数据结构,Spark 提供了强大而灵活的工具来处理大规模数据。通过深入了解 Spark RDD 和 Spark DataFrame,你可以更有效地处理和分析数据,并从中获得有价值的见解和洞察。