让我们假设有一个大型数据集”A”,具有以下架构:

Java

 

 
1
2
|empid整数
3
|萨尔整数
| 名称字符串

5
|地址字符串
6
|dept部门整数

需要根据一组员工 ID(empIds)、”B”(可广播给执行者)筛选数据集”A”,以获得筛选的数据集”A”。筛选器操作可以表示为:

Java

 

x
1
1
A'=A.过滤器A.empId"B"中包含in

为了实现这种最常见的筛选方案,您可以在 Spark 中使用四种类型的转换,每种转换都有自己的优缺点。以下是所有这些转换用于执行此特定筛选方案的使用情况,以及有关每个转换的可靠性和效率方面的详细说明。

过滤器:在数据集上筛选转换(筛选布尔条件表达式上的数据集记录或布尔返回筛选器函数),可按 以下方式使用

Java

 

x
1
1
1.数据集<T>A'=A.过滤器条件
2
2.数据集<T>A'=A.过滤器过滤器功能<T>func
3
3.数据集<T>A'=A.过滤器String字符串条件解释

对于筛选方案,如前所述,可以使用”A”上的”筛选”转换,该转换以”筛选功能”作为输入。在相应数据集的分区中包含的每个记录上调用”Filter 函数”,并返回”true”或”false”

无论数据集”A”的大小如何,使用上述筛选器转换都非常简单、健壮且高效。这是因为,转换是由记录调用的。此外,由于广播的 empIds 集由执行器上的哈希表支持,因此每个记录的筛选器函数中的筛选查找仍然有效。

地图:映射转换(在数据集的每个记录上应用一个函数以返回空、相同或不同的记录类型),用于数据集,使用 方式如下

Java

 

x
1
 
1
数据集<U>A'=A

010437px;”>

对于筛选方案,如前所述,可以使用”A”上的”映射”转换,该转换以”Map 函数”作为输入。在我们的筛选方案中,将在数据集”A”的每个记录上调用”Map 函数”,并检查记录的”empId”是否存在于广播的 empIds 集”B”(由相应的哈希表支持)。如果存在记录,则从 Map 函数返回相同的记录。如果记录不存在,则 将返回 NULL。 此外,Map 函数的编码器输入与数据集”A”的编码器输入相同。

虽然,”Map 函数”的语义与”筛选功能”类似,但与直接的”筛选功能”转换方法相比,使用上述”Map”转换(如上述)的筛选方案并不太简单和优雅。在转换中必须显式预配额外的编码器输入。此外,在调用”映射”转换后,需要为 NULL 值筛选输出,因此,使”映射”方法的效率低于”筛选”方法。但是,该方法的可靠性与”筛选器”方法类似,因为它无论大小为”A”,它都会毫无问题地运行。这是因为,”映射”转换也是由记录调用的。

Map 分区: 映射分区转换在数据集上应用每个分区的函数(在我最近出版的书籍”火花分区指南火花分区深度解释”中了解有关 Spark 分区的详细了解),在数据集上将 null 或一个索引器返回到相同或不同记录类型的新集合),用于 以下方式

Java

 

x
1
1
数据集<U>A'=A.地图地图部分功能<TU>func编码器<U>编码器

对于筛选方案,如前所述,还可以使用”A”上的”映射部分”转换,该转换以”MapPartitions 功能”作为输入。在我们的筛选方案中,将在数据集”A”的每个分区上调用”MapPartions 功能”,对分区的所有记录进行次数,并检查每个记录,如果记录的”empId”存在于广播的 empIds 集”B”(由相应的哈希表支持)。如果存在记录,则在”MapPartitions 功能”中初始化的可返回集合中将添加相同的记录。最后,从”MapPartions 功能”返回可返回集合的运行器。

与”映射”和”筛选”方法相比,”映射分区”方法通常效率更高,因为它操作分区明智,而不是记录明智。但是,与”映射”类似,在转换中必须显式预配编码器输入。此外,如果数据集’A’的某些分区的大小超过执行每个分区计算任务的内存,则”Map 分区”方法可能会变得非常不可靠。这是因为较大的分区可能会导致潜在的更大的可返回集合,导致内存溢出

apache.org/docs/latest/api/java/index.html?org/apache/spark/sql/Dataset.html”rel=”noopener noreferer”目标=”_blank”>如下:

Java

 

x
1
 
1
数据集<>A'=A.联接Dataset数据集 <?>B联接扩展

对于筛选方案,如前所述,还可以在”A”上使用”内部联接”转换,该转换在联接条件上加入”B”的数据集表示形式(AempId),并且仅从每个加入的记录中选择”A”字段。

“内部联接”方法返回通用”Row”对象的数据集,因此需要使用编码器将其转换回 A 的记录类型的数据集,以匹配确切的筛选器语义。但是,与”过滤”应用类似,”内联接”方法高效可靠。效率来自这样一个事实,即由于”B”是可广播的 ,Spark 将选择最有效的”博拉广播哈希联接”方法来执行联接。此外,可靠性还来自这样一个事实,即”内部联接”方法将适用于”A”的大型数据集,就像”筛选”方法一样。

考虑到所有的方法,我会从可靠性和效率的角度选择”过滤器”方法作为最安全的赌注。此外,请注意,”筛选”方法还允许我执行具有类似效率和健壮性的反搜索,而”内部联接”是不允许的。

此外,你可以在这里参考 我原来的故事

Comments are closed.