Первый шаг - преобразовать тип столбца в двойной.
val df = Seq(("a", "25"), ("b", "17"), ("c", "8")).toDF("customer", "age")
.withColumn("age", $"age".cast(DoubleType))
Тогда, если у вас есть только несколько условий, можно использовать when
и otherwise
.Например, используя ваши входные данные и условия:
val df2 = df.withColumn("age_new",
when($"age" <= 10, 0.0).
when($"age" <= 20, 1.0).
when($"age" <= 30, 2.0).
otherwise(3.0))
Если условий много, то использование when
будет раздражать.В этом случае Bucketizer
является хорошей альтернативой:
val splits = Array(0.0, 10.0, 20.0, 30.0)
val bucketizer = new Bucketizer().setInputCol("age").setOutputCol("age_new").setSplits(splits)
val df3 = bucketizer.transform(df)
Вывод одинаков в обоих случаях (столбец age
можно удалить с помощью select
илиdrop
):
+--------+----+-------+
|customer| age|age_new|
+--------+----+-------+
| a|25.0| 2.0|
| b|17.0| 1.0|
| c| 8.0| 0.0|
+--------+----+-------+