分区
Pydoc |
将集合中的元素分成多个输出集合。分区函数包含确定如何将输入集合的元素分成每个结果分区输出集合的逻辑。
必须在图构建时确定分区数量。您不能在管道中间确定分区数量
在 Beam 编程指南 中查看更多信息。
示例
在以下示例中,我们使用包含其图标、名称和持续时间的农产品 PCollection
创建一个管道。然后,我们以多种方式应用 Partition
将 PCollection
分成多个 PCollections
。
Partition
接受一个函数,该函数接收分区数量并返回该元素所需分区的索引。传递的分区数量必须是正整数,并且必须返回 0
到 num_partitions-1
范围内的整数。
示例 1:使用函数分区
在以下示例中,我们有一个已知的持续时间列表。我们将 PCollection
分成一个 PCollection
,用于每种持续时间类型。
示例 2:使用 lambda 函数分区
我们还可以使用 lambda 函数来简化 示例 1。
示例 3:使用多个参数分区
您可以将带有多个参数的函数传递给 Partition
。它们作为附加的位置参数或关键字参数传递给函数。
在机器学习中,将数据分成 训练集和测试数据集 是一项常见的任务。通常,80% 的数据用于训练模型,而 20% 用于测试。
在此示例中,我们将 PCollection
数据集分成训练集和测试数据集。我们定义了 split_dataset
,它接受 plant
元素、num_partitions
和一个附加参数 ratio
。ratio
是一个数字列表,表示每个分区中将包含多少个项目的比例。num_partitions
由 Partitions
作为位置参数使用,而 plant
和 ratio
传递给 split_dataset
。
如果我们要进行 80%/20% 的拆分,我们可以指定一个 [8, 2]
的比例,这意味着对于每 10 个元素,8 个进入第一个分区,2 个进入第二个分区。为了确定将每个元素发送到哪个分区,我们有不同的桶。对于我们的情况 [8, 2]
有 10 个桶,其中前 8 个桶代表第一个分区,最后 2 个桶代表第二个分区。
首先,我们检查比例列表的长度是否与我们传递的 num_partitions
相对应。然后,我们为每个元素获取一个桶索引,范围从 0 到 9 (num_buckets-1
)。我们可以执行 hash(element) % len(ratio)
,但我们改为对 JSON 表示的所有 ASCII 字符进行求和,使其确定性。最后,我们循环遍历比例中的所有元素,并有一个运行总数来识别该桶对应的分区索引。
此 split_dataset
函数具有足够的通用性,可以根据任何比例支持任意数量的分区。您可能希望调整桶分配以对您的数据集使用更合适或随机化的哈希。
相关转换
- 过滤 如果函数只是决定是否输出元素,则很有用。
- ParDo 是最通用的元素级映射操作,它还包括其他功能,例如多个输出集合和侧输入。
- CoGroupByKey 执行按键等值连接。
Pydoc |
最后更新时间:2024 年 10 月 31 日
您找到您要找的一切了吗?
一切都有用和清晰吗?您想改变什么吗?请告诉我们!