Учитывая часы, месяц и год, преобразуйте их в отметку времени в Spark scala.

У меня есть три столбца - "Год", "Месяц" и "Час". Мне нужны входные данные для преобразования этого в метку времени в искре scala.

Пример: мой год 2017, месяц 11 и час 570, мне нужно преобразовать это в метку времени в Spark Scala.

Любые материалы по этому поводу будут очень полезны. Вывод должен быть 2017-11-23 17:00


person Deepika Jantz    schedule 03.10.2018    source источник
comment
Если у вас нет времени в качестве входных данных, вы не можете создать временную метку...   -  person Fernando Aspiazu    schedule 03.10.2018
comment
у меня есть еще один вопрос с этим, учитывая месяц, мне нужно знать количество дней в месяце! Так что я конвертирую эти дни в часы вместо того, чтобы конвертировать в метку времени. Что вы думаете об этом? @ФернандоАспиазу   -  person Deepika Jantz    schedule 03.10.2018
comment
@DeepikaJantz, может быть, вы можете изучить сторонний API для календаря, который возвращает вам эти данные на основе месяца и года, переданных ему?   -  person zenwraight    schedule 03.10.2018
comment
Теперь количество дней в месяце остается постоянным, за исключением февраля, и вы можете рассчитать, является ли год високосным или нет. У января 31, у марта 31, у апреля 30, только у февраля есть от 28 до 29, и в зависимости от года вы можете установить дни для февраля. надеюсь это поможет.   -  person zenwraight    schedule 03.10.2018
comment
Для количества дней в месяце используйте java.time (тоже): YearMonth.lengthOfMonth.   -  person Ole V.V.    schedule 04.10.2018


Ответы (2)


    def getTimeStamp(y:Int,m:Int,h:Int) = {
     require(m<=12,"Invalid Data")
     def leapYr(y:Int) = if(y%100==0) y%400==0 else y%4==0
     val monthDays = Array((1,31),(2,28),(3,31),(4,30),(5,31),(6,30),
                            (7,31),(8,31),(9,30),(10,31),(11,30),(12,31))
     val monthDaysLeap = Array((1,31),(2,29),(3,31),(4,30),(5,31),(6,30),
                            (7,31),(8,31),(9,30),(10,31),(11,30),(12,31))
     val days = if(!leapYr(y)){ monthDays(m-1)._2} else { monthDaysLeap(m-1)._2 }
     val hoursInMonth = days*24
     if(h<=hoursInMonth){ val d:Double = h/24.0; val d1=d.toInt;
          val hr = (24*(d-d1)).toInt; y+"-"+m+"-"+d1+" "+hr+":"+"00" 
     }
     else "Invalid Data"
    }

Тест:

scala> getTimeStamp(2017,11,570)
res36: String = 2017-11-23 18:00
person RAGHHURAAMM    schedule 03.10.2018

LocalDateTime должен сделать это за вас.

import java.time.LocalDateTime
val y = 2017
val m = 11
val h = 570
val d1 = LocalDateTime.of(y, m, 1, 0, 0) // have to use 1 for day
val d2 = d1.plusHours(h)

Я получаю другой результат, чем вы, хотя. Вышеизложенное получает меня:

d2: java.time.LocalDateTime = 2017-11-24T18:00

person Andrew    schedule 03.10.2018