投放后如何从Spark数据框中过滤不良或损坏的行

时间:2019-05-15 07:16:57

标签: pyspark pyspark-sql

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中的更大,那么这两个数据帧是不好的。但是我认为这些解决方案是很老的了。

我想知道更好的解决方法。

1 个答案:

答案 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进行浮点转换的方法相同。