在这篇文章中,我们将介绍Spark数据集API,所以让我们开始吧。
数据集API
数据集也是两种特性的结合:类型化和非类型化的API,如图所示:(fig1)
让我们通过比较Dataframe来更好地理解Datasets,Scala中的Dataframe是一个通用对象集合的别名,即Datasets[Row],其中Row是一个通用类型,可以容纳不同类型的字段;另一方面,Datasets文档是这样说的。
一个强类型的特定领域对象的集合,可以使用函数式或关系式操作进行并行转换。每个数据集[在Scala中]也有一个非类型化的视图,称为Dataframe
,它是一个行的数据集。
如何创建数据集?
由于数据集是强类型的,所以你需要知道的第一件事就是模式。换句话说,就是数据类型。在Scala中创建数据集的最简单方法是通过使用case类来推断模式。让我们举个例子来更好地了解一下。
case class IoTDeviceData(device_id: Long, device_name: String, ip: String, cca2: String, cca3: String, cn: String, latitude: Double,longitude: Double, scale: String, temp: Long, humidity: Long, c02_level: Long, lcd: String, timestamp: Long)
val ds = spark.read
.json("dbfs:/FileStore/iot_device.json")
.as[IoTDeviceData]
ds.show(5, false) (Image2)
数据集操作
我们可以执行与在Dataframe上执行的相同的转换和操作。让我们举几个例子。
从一个过滤器的转换开始
val filteredDS = ds.filter(col => col.temp > 30 && col.humidity > 70)
filteredDS.show() (Image3)
上面的实现给了我们数据框架和数据集api的另一个区别,因为数据集api中的过滤器转换是一个重载方法filter (func:(T) > Boolean)。Dataset[T],需要一个lambda函数,func: (T) > Boolean 作为其参数。
而在Dataframe API中,你把你的filter() 条件表达为类似SQL的DSL操作。
Dataframe和数据集的区别
如果你读过我之前关于Dataframe的博客,以及这篇博客,你一定想知道什么时候该用什么,所以让我们来看看。
- 如果你想要严格的编译类型安全,那么就使用数据集。
- 有时你的项目需要高级表达式,如过滤器、地图、聚合或SQL查询,那么你可以选择同时使用Dataframe和Datasets。
- 如果你想利用并受益于Tungsten的高效序列化编码器,请使用数据集。
- 如果你想提高空间和速度,请使用数据框架。
- 如果你想在编译时而不是在运行时捕获错误,那么在下图的基础上你可以选择你的API。
总结
以上就是Spark结构化API的第一部分,我们已经介绍了数据集的所有基础知识。


