Мне нужно извлечь и преобразовать из большого набора данных некоторую информацию, которая впоследствии будет использоваться другим набором данных.
Поскольку используемая информация всегда одинакова и ее можно хранить в пареПо умолчанию, я собирался сохранить эту информацию в виде карты, которая будет использоваться udf, поэтому я избегаю нескольких обращений к большому набору данных.
Проблема в том, что я получаю следующееошибка:
org.apache.spark.SparkException: Task not serializable
Есть ли способ сделать сериализуемую карту?
Если это невозможно, есть ли другой способ сохранить информацию в объекте просмотра в Spark?
Вот мой код:
val cityTimeZone: scala.collection.immutable.Map[String,Double] = Map("CEB" -> 8.0, "LGW" -> 0.0, "CPT" -> 2.0
, "MUC" -> 1.0, "SGN" -> 7.0, "BNE" -> 10.0, "DME" -> 3.0, "FJR" -> 4.0, "BAH" -> 3.0, "ARN" -> 1.0, "FCO" -> 1.0, "DUS" -> 1.0, "MRU" -> 4.0, "JFK" -> -5.0, "GLA" -> 0.0)
def getLocalHour = udf ((city:String, timeutc:Int) => {
val timeOffset = cityTimeZone(city)
val localtime = if((timeutc+timeOffset)%24 >= 0)(timeutc+timeOffset)%24 else ((timeutc+timeOffset)%24)*(-1)
localtime
})
//$"dateutc" is a timestamp column like this: 2017-03-01 03:45:00 and $"city" a 3 letters code in capitals, like those in the map above
val newDF = DF
.select("dateutc","city")
.withColumn("utchour", hour($"dateutc"))
.withColumn("localhour", getLocalHour($"city", $"utchour"))
display(newDF)