2016-04-29 2 views
0

Я пытаюсь преобразовать имя строки дня недели (например, TUESDAY) в целое число (например, 3). Я написал карту ниже, но я не уверен, как ее применять.Spark SQL: преобразование имени дня недели в целое число

import org.apache.spark.sql.functions.lower 

val dayNameToInteger = Map(
    "sunday" -> 1, 
    "monday" -> 2, 
    "tuesday" -> 3, 
    "wednesday" -> 4, 
    "thursday" -> 5, 
    "friday" -> 6, 
    "saturday" -> 7) 


var input = sqlContext.createDataFrame(Seq(
    (0L, "SUNDAY", 34), 
    (1L, "Monday", 31), 
    (2L, "tuesday", 25) 
    )).toDF("id", "day_of_week", "value") 


scala> input.show 
+---+-----------+-----+ 
| id|day_of_week|value| 
+---+-----------+-----+ 
| 0|  SUNDAY| 34| 
| 1|  Monday| 31| 
| 2| tuesday| 25| 
+---+-----------+-----+ 


var output = input.select($"id", dayNameToInteger(lower(input("day_of_week")))) 
<console>:27: error: type mismatch; 
found : org.apache.spark.sql.Column 
required: String 
     var output = input.select($"id", dayNameToInteger(lower(input("day_of_week")))) 

ответ

0

Преобразование должно быть сделано через UDF, так как это может работать на колонке над всеми рядами.

val dayToInt = udf((dayOfWeek:String) => { 
    dayOfWeek match { 
     case "sunday" => 1 
     case "monday" => 2 
     case "tuesday" => 3 
     case "wednesday" => 4 
     case "thursday" => 5 
     case "friday" => 6 
     case "saturday" => 7 
    } 
}) 


var output = input.select($"id", dayToInt(lower(input("day_of_week"))).as("day_int")) 


scala> output.show 
+---+-------+ 
| id|day_int| 
+---+-------+ 
| 0|  1| 
| 1|  2| 
| 2|  3| 
+---+-------+ 
0

В качестве улучшения в ответ выше, вот мой Спарк 2.x совместимые взять на UDF индексировать день недели строки в целое число:

spark.sqlContext.udf.register("dayToInt", (dayOfWeek:String) => { 
    dayOfWeek.toLowerCase() match { 
     case "sunday" => 1 
     case "monday" => 2 
     case "tuesday" => 3 
     case "wednesday" => 4 
     case "thursday" => 5 
     case "friday" => 6 
     case "saturday" => 7 
    } 
}) 

также использование для машины учебная модель:

sql("""SELECT CAST(dayToInt(date_format(dateEst, 'EEEE')) AS float) AS dayOfWeekInt 
FROM data""") 
Смежные вопросы