Получить количество нулей на строку в кадре данных PySpark - PullRequest
0 голосов
/ 21 сентября 2018

Вероятно, это дубликат, но каким-то образом я уже давно ищу:

Я хочу получить число нулей на строку в кадре данных Spark.Т.е.

col1 col2 col3
null    1    a
   1    2    b
   2    3 null

В конце должно быть:

col1 col2 col3 number_of_null
null    1    a              1
   1    2    b              0
   2    3 null              1

В общем, я хочу получить число раз, когда определенная строка или число появляется в строке фрейма данных искры.

Т.е.

col1 col2 col3  number_of_ABC
 ABC    1    a              1
   1    2    b              0
   2  ABC  ABC              2

Я использую Pyspark 2.3.0 и предпочитаю решение, не включающее синтаксис SQL.По какой-то причине я, кажется, не могу гуглить это.: /

РЕДАКТИРОВАТЬ: Предположим, у меня так много столбцов, что я не могу перечислить их все.

РЕДАКТИРОВАТЬ2: Я явно не хочу, чтобы решение для панд.

EDIT3: Решение, объясненное с помощью сумм или средств, не работает, так как выдает ошибки:

(data type mismatch: differing types in '((`log_time` IS NULL) + 0)' (boolean and int))
...
isnull(log_time#10) + 0) + isnull(log#11))

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Как указано в ответе pasha701, я прибегаю к map и reduce.Обратите внимание, что я работаю над Spark 1.6.x и Python 2.7

Принимая ваш DataFrame как df (и как есть)

dfvals = [
  (None, "1", "a"),
  ("1", "2", "b"),
  ("2", None, None)
]

df = sqlc.createDataFrame(dfvals, ['col1', 'col2', 'col3'])

new_df = df.withColumn('null_cnt', reduce(lambda x, y: x + y,
                                         map(lambda x: func.when(func.isnull(func.col(x)) == 'true', 1).otherwise(0),
                                             df.schema.names)))

Проверьте, является ли значение Null и присвойте 1 или 0.Добавьте результат, чтобы получить количество.

new_df.show()

+----+----+----+--------+
|col1|col2|col3|null_cnt|
+----+----+----+--------+
|null|   1|   a|       1|
|   1|   2|   b|       0|
|   2|null|null|       2|
+----+----+----+--------+
0 голосов
/ 22 сентября 2018

В Scala:

val df = List(
  ("ABC", "1", "a"),
  ("1", "2", "b"),
  ("2", "ABC", "ABC")
).toDF("col1", "col2", "col3")
val expected = "ABC"
val complexColumn: Column = df.schema.fieldNames.map(c => when(col(c) === lit(expected), 1).otherwise(0)).reduce((a, b) => a + b)
df.withColumn("countABC", complexColumn).show(false)

Вывод:

+----+----+----+--------+
|col1|col2|col3|countABC|
+----+----+----+--------+
|ABC |1   |a   |1       |
|1   |2   |b   |0       |
|2   |ABC |ABC |2       |
+----+----+----+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...