指定字段筛选
更新时间:2026-07-29
简介
指定字段筛选算子(SpecifiedFieldSelector),按指定字段做 Top-K / 区间 / 频次的数据集级选择。它是数据集级算子:transform 接收目标字段整列,返回布尔保留掩码,由上层 Daft .where() 完成过滤。纯 CPU。
功能描述
• 支持三种选择模式(由 mode 指定):topk 取前 K、range 值区间筛选、frequency 频次筛选。
• topk 模式支持按条数 topk 或按比例 top_ratio 取值(两者同给取较小者),并可通过 reverse 控制升/降序;None 值按方向填充 ±inf。
• range 模式按闭区间 [lower, upper] 保留字段值落在区间内的行;None 值不入选。
• frequency 模式统计各取值出现次数,按 [freq_lower, freq_upper] 频次区间保留;输出为布尔列,交由 .where() 完成最终过滤。
算子参数
输入
| 输入 | 含义 |
|---|---|
| field | 用于排序/筛选的字段整列(数值或可哈希值),算子据此计算保留掩码 |
输出
| 输出 | 含义 |
|---|---|
| result | bool 类型的保留掩码列,True 表示该行入选;配合上层 Daft .where(col(...)) 过滤数据集 |
参数
| 参数名称 | 类型 | 默认值 | 描述 | |
|---|---|---|---|---|
| mode | str | "topk" |
选择模式,可选值 topk / range / frequency,非法值抛 ValueError |
|
| topk | int |None | None |
mode=topk 时保留的条数;None 表示不按条数限制 |
|
| top_ratio | float |None | None |
mode=topk 时保留比例(0~1);与 topk 同时给出时取较小的保留数 |
|
| reverse | bool | True |
mode=topk 是否降序,True 取字段值最大的 K 个,False 取最小的 K 个 |
|
| lower | float |None | None |
mode=range 时字段值的下界(闭区间);None 表示不设下界 |
|
| upper | float |None | None |
mode=range 时字段值的上界(闭区间);None 表示不设上界 |
|
| freq_lower | float |None | None |
mode=frequency 时取值出现次数的下界;None 表示不设下界 |
|
| freq_upper | float |None | None |
mode=frequency 时取值出现次数的上界;None 表示不设上界 |
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.other.specified_field_selector import SpecifiedFieldSelector
10
11if __name__ == "__main__":
12 if os.getenv("DAFT_RUNNER", "native") == "ray":
13 import ray
14
15 ray.init(ignore_reinit_error=True)
16 daft.set_runner_ray()
17 daft.set_execution_config(min_cpu_per_task=0)
18
19 # SpecifiedFieldSelector 无路径入参,用小 python 数据即可
20 scores = [0.9, 0.2, 0.7, 0.5, 0.95]
21 ds = daft.from_pydict({"score": scores})
22 ds = ds.with_column(
23 "keep",
24 aihc_udf(
25 SpecifiedFieldSelector,
26 construct_args={"mode": "topk", "topk": 2, "reverse": True},
27 num_cpus=1,
28 concurrency=1,
29 batch_size=len(scores),
30 )(col("score")),
31 ).where(col("keep")) # 数据集级选择:仅保留 Top-2
32 ds.show()
评价此篇文章
