df1
+-------+-------+-----+
| ID | Score| hits|
+-------+-------+-----+
| 01| 100| Null|
| 02| Null| 80|
| 03| spark| 1|
| 04| 300| 1|
+-------+-------+-----+
将Score转换为int并使其浮动后,我得到以下数据框:
df2
+-------+-------+-----+
| ID | Score| hits|
+-------+-------+-----+
| 01| 100| Null|
| 02| Null| 80.0|
| 03| Null| 1.0|
| 04| 300| 1.0|
+-------+-------+-----+
现在我只想提取不良记录,不良记录意味着转换后产生了null。
我只想对现有数据框执行操作。如果有任何内置方法可以在投射后获取不良记录,请帮帮我。
也请考虑这是示例数据帧。该解决方案应解决任意数量的列和任何方案。
我尝试通过将空记录从两个数据帧中分离出来并进行比较。我也考虑过添加另一列具有空值的列,然后比较两个数据帧,如果在df2中空值的数量比在df1中的更大,那么这两个数据帧是不好的。但是我认为这些解决方案是很老的了。
我想知道更好的解决方法。
答案 0 :(得分:1)
您可以使用自定义函数/ udf将字符串转换为整数,并将非整数值映射到特定数字,例如。 -999999999。
稍后您可以过滤-999999999来识别原始的非整数记录。
def udfInt(value):
if value is None:
return None
elif value.isdigit():
return int(value)
else:
return -999999999
spark.udf.register('udfInt', udfInt)
df.selectExpr("*",
"udfInt(Score) AS new_Score").show()
#+---+-----+----+----------+
#| ID|Score|hits| new_Score|
#+---+-----+----+----------+
#| 01| 100|null| 100|
#| 02| null| 80| null|
#| 03|spark| 1|-999999999|
#| 04| 300| 1| 300|
#+---+-----+----+----------+
过滤-999999999以识别非整数(错误记录)
df.selectExpr("*","udfInt(Score) AS new_Score").filter("new_score == -999999999").show()
#+---+-----+----+----------+
#| ID|Score|hits| new_Score|
#+---+-----+----+----------+
#| 03|spark| 1|-999999999|
#+---+-----+----+----------+
使用自定义udf进行浮点转换的方法相同。