最近工作用到 Spark, 这里记一些自己接触到的 Spark 基本概念和知识.
本文链接: https://www.cnblogs.com/hhelibeb/p/10288915.html
名词
RDD: 在高层, 每个 Spark 应用包含一个 driver 程序, 它运行用户的主函数, 在集群上执行不同的并行作业. Spark 中提供的主要抽象是弹性分布式数据集(resilient distributed dataset, RDD), 它是分布在集群节点中的已分区的元素集合, 可以被并行处理. RDD 从 Hadoop 文件系统中的文件创建, 或者从驱动程序中已有的 Scala 集创建. 用户也可以要求 Spark 将 RDD 持久化在内存中, 允许它在并行操作中被高效地复用. 最后, RDD 可以从节点故障中自动恢复.
Spark SQL: 一个用于处理结构化数据的 Spark 模块. 和 RDD API 不同, Spark SQL 提供的接口会提供给 Spark 关于数据的结构和计算的更多信息. 在内部, Spark SQL 使用额外的信息来执行额外优化. 有许多方式可以与 Spark SQL 交互, 包含 SQL 和 Dataset API. 在进行计算时, 无论使用哪种 API / 编程语言, 都会使用相同的执行引擎. 这意味着开发者可以基于数据变换的需要来自由切换不同的 API.
Dataset:Dataset 是分布式的数据集合. Dataset 是 Spark 1.6 中新加入的接口, 提供了 RDD 的优势 (强类型化, 应用 lambda 函数的能力), 也提供了 Spark SQL 的优化执行引擎的优势. Dataset 可以由 JVM 对象构造, 然后通过函数变换(map, flatMap, filter 等) 来操纵. Dataset API 在 Scala 和 Java 中可用. Python 不支持 Dataset API, 但是由于 Python 的动态性, 已经可以享受许多 Dataset API 的好处.(例如你可以通过 row.columnName 的方式自然地访问行中的字段).R 语言的情形与之类似.
DataFrame:DataFrame 是一种有列名的 Dataset. 它在概念上等于关系数据库中的表或者 R/Python 中的数据帧, 但是在底层有更多的优化. DataFrame 可以从一个多重源构造, 比如: 结构化数据文件, Hive 中的表, 外部数据库或者既有的 RDD.DataFrame API 在 Scala,Java,Python 和 R 中可用. 在 Scala 和 Java,DataFrame 被表示为多行 Dataset. 在 Scala API 中, Dataframe 可以简单地表示为 Dataset[Row]. 而在 Java API 中, 用户需要使用 Dataset<Row > 来表示 Dataframe.
TempView:createOrReplaceTempView 方法会创建 (如果已存在同名视图的话, 则替换) 一个惰性计算 https://en.wikipedia.org/wiki/Lazy_evaluation 视图, 你可以将这个视图视作 hive 表来使用. 除非你将 Dataset 缓存, 否则它不会持久化到内存中. 可以使用 spark.catalog.dropTempView("tempViewName")来删除视图.
Caching and Persistence: 缓存或持久化是 Spark 计算的优化技术. 它们有助于保存临时部分结果, 以便可以在后续阶段重复使用. 因此, RDD 的这些中间结果保存在内存 (默认) 或固态存储 (如磁盘和 / 或复制) 中.
SparkSession:Spark SQL 的入口点. 在开发 Spark SQL 应用时, 这是首先要创建的对象之一.
你可以使用 SparkSession.builder 方法来创建 SparkSession.
- import org.apache.spark.sql.SparkSession
- val spark = SparkSession.builder
- .appName("My Spark Application") // optional and will be autogenerated if not specified
- .master("local[*]") // only for demo and testing purposes, use spark-submit instead
- .enableHiveSupport() // self-explanatory, isn't it?
- .config("spark.sql.warehouse.dir", "target/spark-warehouse")
- .withExtensions { extensions =>
- extensions.injectResolutionRule { session =>
- ...
- }
- extensions.injectOptimizerRule { session =>
- ...
- }
- }
- .getOrCreate
一旦被创建, SparkSession 会允许你创建 Dataframe(基于 RDD 或一个 Scala Seq 等), 创建 Dataset, 方为 Saprk SQL 服务(例如 ExperimentalMethods, ExecutionListenerManager, UDFRegistration), 运行 SQL 查询, 载入表以及访问 DataFrameReader 接口以载入选定格式的 Dataset.
你的单个应用中可以有多个 SparkSession. 常见的用例是让每个 SparkSession 保持关系实体在逻辑上分离.
模块
SparkContext: Spark 功能的主入口.
RDD: 弹性分布式数据集, 见上文.
Broadcast: 可以在 task 间复用的广播变量.
Accumulator: 只允许增加值的共享变量.
SparkConf: 配置 Spark 用.
SparkFiles: 访问由作业载入的文件.
StorageLevel: 缓存持久化的级别.
TaskContext: 当前运行的作业的信息(实验性).
RDDBarrier: 用屏障包装 RDD 以实现屏障执行.
BarrierTaskContext: 为屏障执行提供额外信息和工具的 TaskContext.
BarrierTaskInfo: 与屏障作业有关的信息.
类
pyspark.sql.SparkSession: Dataframe 和 Spark SQL 功能的主入口点.
pyspark.sql.DataFrame: 按列名分组的分布式数据集合, 见上文.
pyspark.sql.Column: Dataframe 中的列表达式.
pyspark.sql.Row: Dataframe 中的行.
pyspark.sql.GroupedData: 聚合方法, 由 DataFrame.groupBy()返回.
pyspark.sql.DataFrameNaFunctions: 处理丢失数据 (null 值) 的方法.
pyspark.sql.DataFrameStatFunctions: 静态功能方法.
pyspark.sql.functions: 对 Dataframe 可用的内建函数.
pyspark.sql.types: 可用的数据类型列表,
pyspark.sql.Windows: 用于使用 Windows 函数
参考:
- Spark Python API Docs
- Spark SQL Guide
- How does createOrReplaceTempView work in Spark?
- Mastering Apache Spark 2.3.2
Spark 编程指南
Spark: Why should we use SparkSession ?
来源: https://www.cnblogs.com/hhelibeb/p/10288915.html