问题描述
我正在使用数据期望来验证特定列是否满足某些必需条件。我能够编写用于检查列是否唯一的代码。但是我无法编写代码来过滤列,然后为该结果数据框检查另一列是否唯一。 例如,请找出以下两个场景,在这两个场景中,我们都需要检查 Department_id = "CSE" 是否具有唯一的 roll_no :
- 场景 1:
reg_no | department_id | roll_no |
---|---|---|
1 | CSE | 1 |
2 | ECE | 1 |
3 | ECE | 2 |
4 | CSE | 2 |
5 | 我 | 1 |
6 | EEE | 1 |
7 | CSE | 2 |
在这种情况下,它应该失败,因为 CSE 有重复的 roll_no :
- 场景 2:
reg_no | department_id | roll_no |
---|---|---|
1 | CSE | 8 |
2 | ECE | 2 |
3 | ECE | 5 |
4 | CSE | 4 |
5 | 我 | 3 |
6 | EEE | 2 |
7 | CSE | 1 |
在这种情况下,作业应该通过,因为 deparment_id = "CSE" 具有唯一的 roll_no 值。 请让我知道如何满足上述 2 种情况,其中应首先过滤数据框,然后使用代工厂数据期望检查列是否唯一。
解决方法
您可以简单地构建两个数据框并检查它们是否具有相同的大小:
- 对于第一个,只需过滤
var paddingHeight = 40; var rowHeight = dataTable.getNumberOfRows() * 15; var options = { height:chartHeight,}
并选择department_id='CSE'
- 对于第二个过滤器
roll_no
,选择department_id='CSE'
并调用roll_no
如果它们的大小相同,则您的数据框在 Department_id 方面是唯一的
,IIUC - 有两种方法可以解决这个问题 -
一个只会告诉重复值的通用代码 -
df = spark.createDataFrame([(1,"CSE",1),(2,"ECE",(3,2),(4,(5,"ME",(6,"EEE",(7,2)],["reg_no","department_id","roll_no"])
df.show()
df \
.groupby(['department_id','roll_no']) \
.count() \
.where('count > 1') \
.sort('count',ascending=False) \
.show()
这将帮助您识别 depertment_id 是否唯一
_w = W.partitionBy("department_id").orderBy("department_id")
df = df.withColumn("roll_no_list",F.collect_list("roll_no").over(_w)).withColumn("roll_no_set",F.collect_set("roll_no").over(_w))
df = df.withColumn("cond_col",F.when(F.size(F.col("roll_no_list")) == F.size(F.col("roll_no_set")),"Unique").otherwise("Not Unique"))
df.show()
+------+-------------+-------+------------+-----------+----------+
|reg_no|department_id|roll_no|roll_no_list|roll_no_set| cond_col|
+------+-------------+-------+------------+-----------+----------+
| 1| CSE| 1| [1,2,2]| [1,2]|Not Unique|
| 4| CSE| 2| [1,2]|Not Unique|
| 7| CSE| 2| [1,2]|Not Unique|
| 2| ECE| 1| [1,2]| Unique|
| 3| ECE| 2| [1,2]| Unique|
| 6| EEE| 1| [1]| [1]| Unique|
| 5| ME| 1| [1]| [1]| Unique|
+------+-------------+-------+------------+-----------+----------+