Добавить столбец на основе условия, выполненного в других столбцах - PullRequest
1 голос
/ 04 мая 2019

Я новичок в PySpark и в настоящее время сталкиваюсь с проблемой следующей проблемы. У меня есть искра df следующим образом

DeviceID     max(A)    max(B)    max(INUT)
0023002      2.5       3.7       8.1
0023045      2.2       1.3       11.3
0023008      4.7       2.3       1.9

Как я хочу добавить другой столбец как «Статус», где значения будут основаны на следующей логике.

if 0.20 * max(INUT) > max(max(A),max(B)) then Status = 'Imbalance' else 'Balance'

Ожидается, что приведенная выше логика создаст следующий кадр данных.

DeviceID     max(A)    max(B)    max(INUT)    Status
0023002      2.5       3.7       8.1          'Balance'
0023045      2.2       1.3      11.3          'ImBalance'
0023008      4.7       2.3       1.9          'Balance'

Теперь для достижения вышеуказанного df ниже приведен код, который я использую

from pyspark.sql.function import col
import pyspark.sql.function as F
df_final = df.withColumn(
             'Status',
             F.when(col('max(INUT)')*0.20 > F.greatest(col('max(A)'),col('max(B)'),
             'Imbalance')\
         .otherwise('Balance')

Приведенный выше фрагмент кода выдает ошибку как

AttributeError: 'tuple' object has no attribute 'otherwise'

Где я пропускаю? Любые советы будут оценены.

1 Ответ

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

Были некоторые небольшие синтаксические ошибки, вот ваш окончательный код:

import pyspark.sql.functions as F

df = spark.createDataFrame(
[("0023002", 2.5, 3.7, 8.1),
("0023045", 2.2, 1.3, 11.3),
("0023008", 4.7, 2.3, 1.9)], ["DeviceID", "max_A", "max_B", "max_INUT"])

df_final = df.withColumn('Status', \
             F.when(F.col('max_INUT')*0.20 > F.greatest(F.col('max_A'),F.col('max_B')), 'Imbalance') \
         .otherwise('Balance'))

И некоторые комментарии / замечания:

  1. Чтобы использовать функции из pyspark.sql.functions, просто используйте псевдоним F. Вам не нужно импортировать его дважды.
  2. Были некоторые пропущенные скобки
  3. Я также заменил max(A) -> max_A, так как это облегчает чтение, я считаю

Выход:

+--------+-----+-----+--------+---------+
|DeviceID|max_A|max_B|max_INUT|   Status|
+--------+-----+-----+--------+---------+
| 0023002|  2.5|  3.7|     8.1|  Balance|
| 0023045|  2.2|  1.3|    11.3|Imbalance|
| 0023008|  4.7|  2.3|     1.9|  Balance|
+--------+-----+-----+--------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...