2016-04-29 12 views
0

Ich versuche, einen Wochentagszeichenfolgennamen (z. B. DIENSTAG) in eine ganze Zahl (z. B. 3) zu konvertieren. Ich habe unten eine Karte geschrieben, bin mir aber nicht sicher, wie ich sie anwenden soll.Spark SQL: Konvertieren eines Wochentagsnamens in eine ganze Zahl

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")))) 

Antwort

0

Die Umwandlung sollte durch eine UDF getan werden, wie die auf einer Spalte über alle Zeilen arbeiten kann.

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

Als Verbesserung der obigen Antwort, hier ist meine Spark-2.x kompatibel nehmen auf dem UDF der Tag der Woche String in einen Integer zu indizieren:

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 
    } 
}) 

auch Verwendung für eine Maschine Lernmodell:

sql("""SELECT CAST(dayToInt(date_format(dateEst, 'EEEE')) AS float) AS dayOfWeekInt 
FROM data""") 
Verwandte Themen