Конвертировать два столбца в зависимости от состояния строкового столбца и других столбцов 2 и 3 Pyspark UDF - PullRequest
1 голос
/ 22 апреля 2020

data table Привет

Я хотел преобразовать некоторые значения cm (ref_low = 20 и ref_low <40, & ref_high> 70 и ref_high <90,) в метр, используя формула (см / 100). Я пытался использовать Pyspark UDF </p>

c_udf = udf (лямбда-вэл: val / 100, если ref_low = 20 и ref_low <40, еще val) df = df.withColumn ("new", c_udf ("ref_low" ")). withColumn (" new ", c_udf (" ref_high ")) </p>

Вопрос1: Как добавить unit = Cm в UDF? и сохранить все остальные значения как таковые.

Спасибо

1 Ответ

2 голосов
/ 22 апреля 2020

Я думаю, это то, что вы хотите. Встроенные искры when/otherwise являются адекватными. Вам просто нужно express логическое значение соответственно.

from pyspark.sql import functions as F
df.withColumn("ref_low", F.when((F.col("unit")=='cm')&((F.col("ref_low")<40)|\
                                 (F.col("ref_low")==20)), F.col("ref_low")/100)\
             .otherwise(F.col("ref_low")))\
  .withColumn("ref_high", F.when((F.col("unit")=='cm')&((F.col("ref_high")<90)&\
                                  (F.col("ref_high")>70)),F.col("ref_high")/100)\
             .otherwise(F.col("ref_high"))).show()

#+-----+-------+--------+
#| unit|ref_low|ref_high|
#+-----+-------+--------+
#|   cm|    0.3|    50.0|
#|   cm|   40.0|    70.0|
#|   cm|    0.2|    0.85|
#|   cm|    0.2|    0.85|
#|   cm|    0.3|    0.76|
#|   cm|   43.0|    65.0|
#|Meter|    0.2|    0.65|
#|Meter|    0.4|    0.68|
#|Meter|    0.5|     0.8|
#+-----+-------+--------+
...