Интеграция с механизмом правил Pyspark в Azure Databricks

#dataframe #pyspark #databricks #rule-engine

Вопрос:

Наличие двух кадров данных, в одном из которых есть фактические данные, а в другом-правила, которые необходимо проверить.

дисплей(DF1) — Основная таблица данных:

введите описание изображения здесь

дисплей(DF2) — Таблицы правил:

|S.No. | Col_1   |   Col_2               | Col_3          Col_4  Col_5#10;| -----|--------|-----------------------|--------------------------------------------#10;|1     | B      |   Col_2 <> (01 or 02) | Col_3 = empty  Col_4 <> 6300600   null#10;|2     | F      |   Col_2 <> (01 or 02) | Col_3 = empty  null    Customer = ‘A2’#10;|3     |(all)   |   Col_2 <> (01 or 02) | Col_3 = 12 or#10;|                        |  CUSTOMER in OP Customer List    null    null#10;|4     | F      |   Col_2 <> (01 or 02) | Col_3 = 00 or 01 or 15    null     (CUSTOMER not in OP Customer List)#10;|5     | F      |   Col_2 <> (01 or 02) | Col_3 = 00 or 01 or 15    null     (CUSTOMER not in OP Customer List)#10;|6     | F      |   Col_2 <> (01 or 02) | Col_3 = 00 or 01 or 15    null     (CUSTOMER not in OP Customer List)#10;|7     | F      |    null               | Col_3 = empty null     (CUSTOMER not in OP Customer List)#10;|8     | B      |   Col_2 <> (01 or 02) | null   Col_4 = 6001500    null» src=»https://i.stack.imgur.com/MKLo7.png»></a></p>
<p><strong>Описание приведенных выше данных:</strong></p>
<p>DF1: Есть более 30 столбцов с данными, из которых мне нужно проверить 10  столбцов на наличие условий в DF2</p>
<p>DF2: Есть более 10 столбцов с правилами(примерно 20, т. е. эти правила будут меняться, вероятно, раз в год)</p>
<p><strong>Чего Я Не Хочу</strong>:</p>
<ol>
<li>Длинное и сложное кодирование на Python с механизмом правил, таким как Drools</li>
<li>Сложные и бесконечные операторы If else/ When().В противном случае()</li>
</ol>
<p><strong>Что я пробовал:</strong><br />
<strong>1. Механизм бизнес-правил (PyPI) — <a rel=Ссылка

 from business_rule_engine import RuleParser

params = {
    'Col_2': DF1.where(DF1.SNO == 1).select('Col_2')
}

rules = """
rule "1"
when
    Col_2= "B"
then
    print("Yayyyy")
end
"""

parser = RuleParser()
parser.register_function(print)
parser.parsestr(rules)
parser.execute(params)
 

The above one always returns FALSE no matter what If i pass a DF. If I pass a manual Record like
params = {
‘Col_2’: ‘B’
}

It will return TRUE.

Need help on how to pass DF rows multiple columns

2 rule-engine (PyPi) — Link:

 import rule_engine

rule = rule_engine.Rule(
    'Col_2 == "B" and (Col_3 != 1 or Col_3 != 2)'
) 
rule.matches({
  DF1.where(DF1.SNO == 1)  
}) 
 

Приведенное выше всегда возвращает значение FALSE при задании строки через DF, а при задании вручную оно становится ИСТИННЫМ. Попробовал даже Rule.filter({ DF1 }), который выдает мне <объект генератора Rule.filter в 0x7f2bdafbe650> в качестве вывода

Мы очень ценим любую помощь. заранее спасибо!