【问题标题】:Palantir Typescript Top N sort in WorkshopPalantir Typescript 在 Workshop 中的 Top N 排序
【发布时间】:2022-07-11 19:28:30
【问题描述】:

我不熟悉 Palantir 中的 typescript 和 Workshop 的概念。

1) 我希望能够显示具有特定特征(例如总 AMOUNT)的顶级 GROUP。 GROUP 超过 12,000 个(因此超过了 Palantir 的限制)。

我尝试指定:有超过 12000 个类别,我会为每个类别的总和(对于列 AMOUNT)!

有什么方法可以避免近似结果并按数量显示前 100 个组(降序)?我希望我可以通过数据透视表直方图来做到这一点。此外,我希望能够显示前 100 个 GROUP 数量的正确总和(或者,更好的是,选择的直方图条)。

2) 此外.. 在直方图上,可以同时选择多个柱(不是 1 也不是全部)?!

3)我可以过滤掉小于某个聚合后值的人吗? (不是来自初始数据集,而是来自聚合) 我可以将枢轴输出保存在对象集中吗?!

我想这两个问题都可以通过一个函数来解决,请问您可以输入 TypeScript 代码来获得我想要的吗?

谢谢!!

【问题讨论】:

  • 前 100 组 12000 是什么意思,例如总数?这是否意味着有 12000 个“金额”,您希望将它们聚合到 100 个桶中并得到它们的总和?或者有 12000 个类别的事物,您想要按总和的前 100 个组的事物金额列的总和?也许一些有代表性的输入和期望的输出可以帮助澄清你的问题。
  • 我编辑了我的问题..如果有任何困难请告诉我...谢谢!

标签: typescript function palantir-foundry foundry-workshop


【解决方案1】:

您可以在转换中执行 1 和 3,而不是尝试在 Quiver 或 Workshop 中直接在对象顶部执行此聚合。这将生成一个预先聚合的数据集,然后您可以从中创建一个对象。然后,您就可以在需要聚合的 Workshop 中使用它。

这可能最适合您的数据规模,因为您提到您有 12000 个存储桶。

如果您想使用截断,变换可能如下所示:

from pyspark.sql import functions as F
from transforms.api import transform_df, Input, Output


@transform_df(
    Output("/path/to/route_aggregation"),
    source_df=Input("/path/to/flights"),
)
def compute(source_df):
    return (
        source_df
        .groupBy(F.col("route_id"))
        .agg(F.sum("distance").alias("total_distance_travelled"))
        .filter(F.col("total_distance_travelled") > 500000)
    )

或者如果你只想要前 100 名:

from pyspark.sql import functions as F, Window as W
from transforms.api import transform_df, Input, Output


@transform_df(
    Output("/path/to/route_aggregation"),
    source_df=Input("/path/to/flights"),
)
def compute(source_df):
    return (
        source_df
        .groupBy(F.col("route_id"))
        .agg(F.sum("distance").alias("total_distance_travelled"))
        .withColumn("row_number", F.row_number().over(W.orderBy(F.col("total_distance_travelled").desc())))
        .filter(F.col("row_number") <= 100)
    )

如果您对对象使用回写,则应使用对象的回写数据集以确保聚合与您通过操作进行的任何编辑保持同步。

这种方法的缺点是您必须维护另一种对象类型,并且它比其他对象类型更不灵活(因为要进行更改,您必须更改转换逻辑并可能更新您的本体定义。这也意味着可能存在有时聚合和单个对象值不同步,因为更新数据集需要时间。此外,这些聚合对象可能会使您的本体混乱,并不是真正意义上的“对象”。

避免这些缺点的一种方法是,如果您可以将此聚合附加到现有的对象,这样做是有意义的。如果您有表示类别的本体对象,则此方法有效。例如,如果您按路线对航班进行分组,然后对行驶距离求和,而不是添加新的聚合对象,您可以只向路线添加一个属性,例如'路线上行驶的总距离'。

【讨论】:

    【解决方案2】:

    如果您尝试聚合到超过 1000 个存储桶中,这可能会出现问题。如果您的对象集大于此(或预计会在不久的将来),请使用其他方法。

    您可以在 TypeScript 中创建一个 Foundry 函数来计算聚合,然后使用此函数来填充 Workshop 表。例如,要查找沿它们行驶的总距离最大的路线(即此处的按属性分组为routeId,求和属性为distance):

    import { Function, TwoDimensionalAggregation, BucketKey, BucketValue } from "@foundry/functions-api";
    import { Objects, ExampleDataFlight } from "@foundry/ontology-api";
    
    export class MyFunctions {
        @Function()
        public async aircraftAggregationExample(): Promise<TwoDimensionalAggregation<string>> {
            const aggregation = await Objects.search().exampleDataFlight()
                     .filter(o => o.distance.range().gt(0))
                     .groupBy(o => o.routeId.topValues())
                     .sum(o => o.distance);
    
            return sortBucketsByValue2D(aggregation, 'desc');
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您尝试聚合到超过 1000 个存储桶中,这可能会出现问题。如果您的对象集大于此(或预计会在不久的将来),请使用其他方法。

      在 Workshop 中对聚合进行分组和排序的最简单方法是添加数据透视表。可以配置如下:

      • 行分组:分组依据的类别
      • 聚合:sum(AMOUNT)

      然后在预览中按聚合列上的下拉菜单并按“降序排序”。

      如果您有大量数据,您可能会收到错误消息:“ 的值过多,并未全部显示。过滤您的数据以获得更准确的结果。”在这种情况下,您应该尽可能预过滤您的数据(例如,删除不相关或零值)或使用其他方法之一。

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 2022-07-05
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 2015-08-17
        • 1970-01-01
        相关资源
        最近更新 更多