Как отфильтровать плохие или поврежденные строки из фрейма искровых данных после приведения - PullRequest
0 голосов
/ 15 мая 2019

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 Ответ

1 голос
/ 15 мая 2019

Вы можете использовать пользовательскую функцию / 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 для преобразования с плавающей запятой.

...