问题描述
我使用 expectations
和 Check
来确定是否可以将十进制类型的列转换为 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) .