Palantir Workshop中TypeScript实现TopN排序等功能的技术咨询
Palantir Foundry Workshop + TypeScript 开发问题解答
问题对应结论
- 超12000分组的精确Top100聚合需求可实现:Palantir原生可视化组件的分组逻辑默认存在基数上限,超量后会自动触发近似计算或截断,通过TypeScript自定义函数做预聚合可以完全绕开该限制,计算过程为精确求和无误差,结果可直接对接Pivot Table、Histogram组件,联动选中的金额计算也会基于精确结果返回。
- Histogram组件支持多柱选中:原生组件自带多选能力,在组件交互配置面板打开「允许多选」开关后,即可按住Ctrl/Cmd点选非连续柱形,或拖拽框选连续区间柱形,不需要额外开发。
- 聚合后阈值过滤、Pivot Table结果转Object Set两个能力均支持:聚合后过滤直接在自定义函数逻辑里处理即可,不需要提前对原始数据集做过滤;只要Pivot Table的行维度绑定了对应Object Type的主键,就可以直接通过Workshop内置动作把筛选后的结果存为可复用Object Set,也可以在自定义函数里直接构造返回Object Set。
可直接复用的TypeScript实现代码
注意把代码里的对象类型、字段名替换成你自己本体里的实际定义即可:
import { Function, Integer, Double, String } from "@foundry/functions"; import { ObjectSet } from "@foundry/object-set"; // 替换为当前业务对应的本体对象导入路径 import { TransactionRecord } from "@foundry/ontology/objects"; /** * 绕开原生分组基数限制,精确计算分组聚合TopN结果 * @param minAmountThreshold 分组总金额最低阈值,低于该值的聚合后分组会被过滤 * @param topNCount 按总金额降序返回的分组数量,默认传100 */ @Function() public async getPreciseTopNGroups( sourceObjectSet: ObjectSet<TransactionRecord>, minAmountThreshold: Double = 0, topNCount: Integer = 100 ): Promise<{ groups: Array<{ groupId: String; groupName: String; totalAmount: Double }>; topNGroupsTotalAmount: Double; topNGroupsObjectSet: ObjectSet<TransactionRecord>; }> { // 仅拉取聚合需要的3个字段,避免拉取冗余字段影响性能 const allRecords = await sourceObjectSet .properties("groupId", "groupName", "amount") .all(); // 逐行遍历做精确分组求和,无近似误差 const groupAggregation = new Map<String, { groupId: String; groupName: String; totalAmount: Double }>(); for (const record of allRecords) { const currentGroup = groupAggregation.get(record.groupId) ?? { groupId: record.groupId, groupName: record.groupName, totalAmount: 0, }; currentGroup.totalAmount += record.amount; groupAggregation.set(record.groupId, currentGroup); } // 基于聚合结果做阈值过滤,不修改原始数据集 const thresholdFilteredGroups = Array.from(groupAggregation.values()).filter( (group) => group.totalAmount >= minAmountThreshold ); // 按总金额降序排序截取TopN const topNGroups = thresholdFilteredGroups .sort((prev, curr) => curr.totalAmount - prev.totalAmount) .slice(0, topNCount); // 计算TopN分组的总金额 const topNTotal = topNGroups.reduce((sum, group) => sum + group.totalAmount, 0); // 构造TopN分组对应的原始对象集,可直接用于组件联动或保存为复用对象集 const topNGroupIds = topNGroups.map((group) => group.groupId); const topNSet = sourceObjectSet.filter((record) => topNGroupIds.includes(record.groupId)); return { groups: topNGroups, topNGroupsTotalAmount: topNTotal, topNGroupsObjectSet: topNSet, }; } /** * 计算Histogram组件选中分组的总金额 * @param selectedGroupIds 直方图选中柱对应的分组ID列表,由组件选中事件直接传入 */ @Function() public async getSelectedGroupsTotal( sourceObjectSet: ObjectSet<TransactionRecord>, selectedGroupIds: Array<String> ): Promise<Double> { if (!selectedGroupIds.length) return 0; const selectedRecords = await sourceObjectSet .filter((record) => selectedGroupIds.includes(record.groupId)) .properties("amount") .all(); return selectedRecords.reduce((sum, record) => sum + record.amount, 0); }
Workshop组件配置步骤
- Pivot Table配置:将函数返回的
groups数组作为数据源传入,行维度选择groupName,值字段选择totalAmount,不要在组件内二次配置聚合规则,避免触发原生分组上限。 - Histogram配置:数据源同样绑定
groups数组,X轴选择totalAmount配置分箱规则,Y轴选择记录计数,打开交互面板的「允许多选」开关,将组件选中事件输出的groupId列表传入getSelectedGroupsTotal函数,即可实时展示选中柱对应的总金额。 - Object Set保存配置:添加一个按钮组件,触发动作选择「保存为Object Set」,入参绑定函数返回的
topNGroupsObjectSet,点击按钮即可将Top100分组对应的所有原始记录存为可复用的对象集。
内容的提问来源于stack exchange,提问作者Jresearcher
相关产品推荐
相关产品推荐

