You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组件配置步骤

  1. Pivot Table配置:将函数返回的groups数组作为数据源传入,行维度选择groupName,值字段选择totalAmount,不要在组件内二次配置聚合规则,避免触发原生分组上限。
  2. Histogram配置:数据源同样绑定groups数组,X轴选择totalAmount配置分箱规则,Y轴选择记录计数,打开交互面板的「允许多选」开关,将组件选中事件输出的groupId列表传入getSelectedGroupsTotal函数,即可实时展示选中柱对应的总金额。
  3. Object Set保存配置:添加一个按钮组件,触发动作选择「保存为Object Set」,入参绑定函数返回的topNGroupsObjectSet,点击按钮即可将Top100分组对应的所有原始记录存为可复用的对象集。

内容的提问来源于stack exchange,提问作者Jresearcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:42:31