0

我使用expectationsandCheck来确定十进制类型的列是否可以转换为 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
4

1 回答 1

1

你是对的,在进入 's 范围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)。

于 2021-04-30T09:17:47.273 回答