Pyspark DataFrame когда и несколько иначе - PullRequest
1 голос
/ 25 марта 2019

Мне нужно создать несколько if в фрейме данных pyspark.

У меня есть две колонки для логического тестирования.

Логика ниже:

  1. Если в столбце A ИЛИ столбце B содержится «что-то», то напишите «X»
  2. Иначе, если (Числовое значение в строке столбца A + Числовое значение в строке столбца B)> 100, тогда напишите «X»
  3. Иначе, если (числовое значение в строке столбца A + числовое значение в строке столбца B)> 50, тогда введите «Y»
  4. Иначе, если (Числовое значение в строке столбца A + Числовое значение в строке столбца B)> 0, тогда пишите «Z»
  5. Остальное, затем напишите "T"

к новому столбцу "РЕЗУЛЬТАТ"

Я думал, что самый быстрый метод поиска - это когда иначе, иначе, иначе, иначе и не получилось в запросе ниже.

Буду признателен, если вы предложите более быстрый метод для этого.

Примечание: когда (предложение) .when (предложение) .when (предложение) .when (предложение) .otherwise (предложение) снова и снова просматривает всю таблицу. Я хочу продолжить работу только с несопоставленными данными.

df = df.withColumn('RESULT', F.when(\
F.when((F.col("A").like("%something%") | F.col("B").like("%something%")), "X").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 100), "X").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 29), "Y").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 0), "Z").otherwise(\
"T"))))))

Желаемый выход

1 Ответ

0 голосов
/ 25 марта 2019

Я все равно получил решение.

df = df.withColumn('RESULT',\
F.when((F.col("A").like("%something%") | F.col("B").like("%something%")), "X").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 100), "X").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 29), "Y").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 0), "Z").otherwise(\
"T")))))
...