如何根据优先级验证规则来验证DataFrame行?

时间:2019-09-02 13:22:31

标签: scala dataframe apache-spark

我想根据某些规则来验证DataFrame,该规则包含另一个名为Rule的DataFrame。 在规则DataFrame的基础上验证输入DataFrame的最佳方法是什么,如果适用于多个规则的任何行检查,则仅获得最高优先级的验证并提供如下数据:

输入数据框:

+---+----+----+-------+-------+-----+-----+-----+-----+
| Id|Name|City|Country|Pincode|flatA|flagB|flagC|flagD|
+---+----+----+-------+-------+-----+-----+-----+-----+
|  1|   A| MUM|  INDIA| 100010| null|    Y|    Y| null|
|  2|   B| MUM|  INDIA| 200020| null| null|    Y| null|
|  3|   C| MUM|  INDIA| 100030| null| null| null|    Y|
|  4|   D| MUM|  INDIA| 500050|    Y|    Y| null| null|
|  5|   E| MUM|  INDIA|3078787| null| null|    Y|    Y|
+---+----+----+-------+-------+-----+-----+-----+-----+

规则数据框:

+------+----+-------+-----+-----+-----+-----+-------+--------+
|Rules#|City|Country|flatA|flagB|flagC|flagD|Pincode|Priority|
+------+----+-------+-----+-----+-----+-----+-------+--------+
|     1| MUM|  INDIA| null|    Y| null| null| 100010|       3|
|     2| MUM|  INDIA| null| null|    Y| null| 200020|       4|
|     3| MUM|  INDIA| null| null| null|    Y| 300030|       6|
|     4| MUM|  INDIA| null|    Y|    Y| null| 400040|       2|
|     5| MUM|  INDIA|    Y|    Y| null| null| 500050|       1|
|     6| MUM|  INDIA| null| null|    Y|    Y| 600060|       5|
+------+----+-------+-----+-----+-----+-----+-------+--------+

预期输出:

+---+----+----+-------+-------+-----+-----+-----+-----+--------------+-----------+
| Id|Name|City|Country|Pincode|flatA|flagB|flagC|flagD|ValidationFlag|New_PinCode|
+---+----+----+-------+-------+-----+-----+-----+-----+--------------+-----------+
|  1|   A| MUM|  INDIA| 100010| null|    Y|    Y| null|         FALSE|     400040|
|  2|   B| MUM|  INDIA| 200020| null| null|    Y| null|          TRUE|     200020|
|  3|   C| MUM|  INDIA| 100030| null| null| null|    Y|         FALSE|     300030|
|  4|   D| MUM|  INDIA| 500050|    Y|    Y| null| null|          TRUE|     500050|
|  5|   E| MUM|  INDIA|3078787| null| null|    Y|    Y|         FALSE|     200020|
+---+----+----+-------+-------+-----+-----+-----+-----+--------------+-----------+

根据上面的示例,对于Id #1中的Input Dataframe第1,2和4条规则均适用,但已选择了第4条规则按照优先级。

规则检查逻辑如下:

  

优先级2: Input.City == Rule.City AND Input.Country == Rule.Country   AND Input.flagB == Y AND Input.flagC == Y

     

优先级3: Input.City ==   Rule.City AND Input.Country == Rule.Country AND Input.flagB == Y

     

优先级4: Input.City == Rule.City AND Input.Country == Rule.Country   AND Input.flagC == Y

     

在AND条件下,应忽略Rule DataFrame中的任何空列

如果ValidationFlagOutput DataFrame列不匹配,则False中新列new_PinCode的值将为PinCode,否则为True 。另一个新列new_PinCode包含PinCode,该Rule Dataframe是根据优先级从"A" (root) {user A, user B, userC} | --- 'B' {user D, user E} | --- 'C' {user F, user G} | --- 'D' {user H, user I} 获得的。

0 个答案:

没有答案