2016-04-29 20 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

、ここでインデックスにUDFに私のスパーク2.xの互換性を取るには、整数に週文字列の日です:

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""") 
関連する問題