认识学习Spark数据集API

92 阅读2分钟

在这篇文章中,我们将介绍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的第一部分,我们已经介绍了数据集的所有基础知识。