Создание ожиданий для всех столбцов определенного типа в Palantir Foundry

Я использую 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



Ответы (1)


Вы правы в том, что df.columns недоступен до тех пор, пока не будет введена область действия my_compute_function. Также нет способа добавить ожидания из среды выполнения, поэтому для этого метода необходимо жестко запрограммировать имена столбцов и сгенерировать ожидания.

Чтобы коснуться первой части вашего вопроса - в альтернативном подходе вы можете попытаться выполнить преобразование decimal -> int/long в восходящем преобразовании, сохранить результат в отдельном столбце, а затем использовать E.col('col_a').equals_col('converted_col_a').

Таким образом, вы можете упростить условие Expectation, а также неявно обрабатывать случаи, когда преобразование будет недостаточным/переполненным, поскольку DecimalType может содержать произвольно большие/маленькие значения (https://spark.apache.org/docs/last/sql-ref-datatypes.html).

person psar    schedule 30.04.2021
comment
Спасибо, я ценю ваш вклад! - person ZygD; 30.04.2021