在 Palantir Foundry 中为特定类型的所有列创建期望

问题描述

我使用 expectationsCheck 来确定是否可以将十进制类型的列转换为 int 或 long 类型。如果列包含整数或小数,其中小数部分仅包含零,则可以安全地转换列。我使用正则表达式函数 rlike 检查它,因为我找不到任何其他使用 expectations方法

问题是,我可以在不明确列出列名的情况下对所有类型为十进制的列进行此类检查吗? df.columns 尚不可用,因为我们尚未进入 my_compute_function

from transforms.api import transform_df,Input,Output,Check
from transforms import expectations as E


@transform_df(
    Output("ri.foundry.main.dataset.1e35801c-3d35-4e28-9945-006ec74c0fde"),inp=Input(
        "ri.foundry.main.dataset.79d9fa9c-4b61-488e-9a95-0db75fc39950",checks=Check(
            E.col('DSK').rlike('^(\d*(\.0+)?)|(0E-10)$'),'Decimal col DSK can be converted to int/long.',on_error='WARN'
        )
    ),)
def my_compute_function(inp):
    return inp

解决方法

您说得对,在输入 df.columns 的范围之前 my_compute_function 不可用。也无法从运行时添加期望值,因此使用此方法需要对列名称进行硬编码并生成期望值。

触及问题的第一部分 - 在另一种方法中,您可以尝试在上游转换中进行 decimal -> int/long 转换,将结果存储在单独的列中,然后使用 E.col('col_a').equals_col('converted_col_a')

通过这种方式,您可以简化 Expectation 条件,同时隐式处理转换会下溢/溢出的情况,因为 DecimalType 可以包含任意大/小值 (https://spark.apache.org/docs/latest/sql-ref-datatypes.html) .