Отображение различных интервалов значений столбца в целые числа - PullRequest
0 голосов
/ 21 мая 2018

У меня есть датафрейм в Spark:

customer  |   age
--------------------
    A         25
    B         17
    C         8

, где столбец customer и age имеет тип string.

Итак,

  • if (0>=age<=10) затем я хочу сопоставить его с 0
  • , если (11>=age<=20), тогда я хочу сопоставить его с 1
  • , если (21>=age<=30), тогда я хочу сопоставить его с 2

Так, что новый фрейм данных становится:

customer_new  |   age_new
--------------------
    A         2    
    B         1    
    C         0

Здесь в новом фрейме данных customer_new имеет тип String, а age_new имеет тип Integer.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Первый шаг - преобразовать тип столбца в двойной.

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|
+--------+----+-------+
0 голосов
/ 21 мая 2018

Всегда рекомендуется максимально использовать встроенные функции .Поскольку, когда функция уже рекомендована другими, вы можете попробовать использовать функцию карты как

import sqlContext.implicits._
df.map(row => {
  val age = row.getAs[String]("age").trim.toInt
  (row.getAs[String]("customer"), if(age >= 0 && age <= 10) "0" else if(age >= 11 && age <= 20) "1" else if(age >= 21 && age <= 30) "2" else null)
})
  .toDF("customer_new", "age_new")

, которая должна дать вам

+------------+-------+
|customer_new|age_new|
+------------+-------+
|A           |2      |
|B           |1      |
|C           |0      |
+------------+-------+
0 голосов
/ 21 мая 2018

Вы можете использовать withColumn с множественной функцией when для определения ваших условий.Попробуйте следующий код,

df.withColumn("customer_new", $"customer")
  .withColumn("age_new",
    when($"age" >= 0 && $"age" <= 10, 0).
      when($"age" >= 11 && $"age" <= 20, 1).
      when($"age" >= 21 && $"age" <= 30, 2)).
  select("customer_new", "age_new").show()

Это даст вам вывод ниже

+------------+-------+
|customer_new|age_new|
+------------+-------+
|           A|      2|
|           B|      1|
|           C|      0|
+------------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...