前言
Dataset 是一种强类型的领域特定对象集合,可以在使用功能或关系操作的同时进行转换。每个 Dataset 也有一个名为 “DataFrame” 的无类型视图,它是 [[Row]] 的 Dataset。
Dataset 上可用的操作分为转换和动作:
转换:产生新的 Dataset ;包括 map, filter, select, and aggregate (groupBy
).
动作:触发计算并返回结果 ;包括 count, show, or 写数据到文件系统。
Dataset是懒加载的,例如:只有提交动作的时候才会触发计算。在内部,Datasets表示一个逻辑计划,它描述生成数据所需的计算。当提交动作时,Spark的查询优化器会优化逻辑计划,并以并行和分布式的方式生成有效执行的物理计划。请使用explain
功能,探索逻辑计划和优化的物理计划。
为了有效地支持特定于领域的对象,需要[[Encoder]]。编码器将特定类型的“T”映射到Spark的内部类型系统。例如:给一个 Person
类,并带有两个属性:name
(string) and age
(int),编码器告诉Spark在运行时生成代码,序列化 Person
对象为二进制结构。
通常有两种创建Dataset的方法:
使用 SparkSession
上可用的 read
方法读取 Spark 指向的存储系统上的文件。
用现存的 Datasets 转换而来。
Dataset操作也可以是无类型的,通过多种领域专用语言(DSL)方法定义:这些操作非常类似于 R或Python语言中的 数据框架抽象中可用的操作。