文档介绍:Spark权威指南(中文版)一第11章Datasets(1)
Datasets是结构化ap的基本类型。我们已经使用过Datarae,它是o类型的Datasets可以跨Spark的不同语言使用。Datasets是一种严格意义上的Java虚拟caseclass#行推理非常容易。可能最重要的特性是caseclass是不可变的,并且允许按结构而不是按值进行比较。Scala文档是这样描述caseclass的:
•不可变性使您无需跟踪事物在何时何地发生了变化
•按值比较允许您将实例作为原始值进行比较不再存在关于类的实例是否按值或引用进行比较的不确定性
•模式匹配简化了分支逻辑,从而减少了错误,提高了代码的可读性。
这些优点也在Spark中得到了应用。
要开始创建ataset让我们为其中一个数据集定义一个caseclass
现在我们定义了一个caseclass它将表示数据集中的一条记录。更简洁地说,我们现在有了一个飞行ataset这没有为我们定义任何方法,只是模式。当我们读取数据时,我们会得到一个ataFrame然而,我们只是使用as方法将其转换为我们指定的行类型
Actions
尽管我们可以看到atase的强大功能,但重要的是要理解像collectta和co1这样的操作是否适用于我们正在使用的数据集或数据流
您还会注意到,当我们实际访问其中一个caseclass寸,我们不需要进行任何类型强制,我们只需要指定caseclas!的属性名称并返回,不仅是期望值,还有期望的类型:
Transformations
atasett的转换与我们在ataFrame上看到的转换相同。您在本节中读到的任何转换都适用于ataset我们鼓励您浏览相关聚合或连接的特定部分。除了这些转换之外,数据集还允许我们指定比单独在ataFrame上执行的更复杂和强类型的转换,因为我们要操作原始aa虚拟机类型。为了演示这个原始对象操作,让我们过滤刚刚创建的ataset
11・4・1・Filtering
让我们看一个简单的例子,创建一个简单的函数,该函数接受一个Flig并返回一个布尔值,该值描述起点和终点是否相同。这不是一个F(少以par定义的方式)而是一个泛型函数。
提示
在下面的示例中,您将注意到我们将创建一个函数来定义这个过滤器。这与我们在书中迄今所做的工作有很大的不同。通过指定一个函数,我们强制par对
atase中的每一行计算这个函数的值。这可能是非常资源密集型的。对于简单的
过滤器,总是首选编写表达式。这将大大降低过滤数据的成本,同时仍然允
许您稍后将其作为atase进行操作
我们现在可以将这个函数传递到filte方法中,指定对于每一行,它都应该验证这个函数返回tre并且在这个过程中会相应地过滤我们的Dataset:
a
结果是:
a
正如我们前面看到的,这个函数根本不需要在par代码中执行。与类似,我们可以在par中使用它之前,使用它并在本地机器上的数
据上测试它。
例如,这个数据集足够小,我们可以收集到驱动程序作为一个Fligt数组)我们可以在上面操作和执行完全相同的过滤操作
结果是:
我们可以看到我们得到了和之前完全一样的答案。
11・4・2・Mapping
Filtering是—个简单的转换,但有时需要将一个值映射到