Получить час от даты () в Java [дубликат]

То, что вы хотите, невозможно без пользовательского UDF. В Scala вы можете сделать что-то вроде этого:

val data = sc.parallelize(Seq(
    """{"userId": 1, "someString": "example1",
        "varA": [0, 2, 5], "varB": [1, 2, 9]}""",
    """{"userId": 2, "someString": "example2",
        "varA": [1, 20, 5], "varB": [9, null, 6]}"""
))

val df = sqlContext.read.json(data)

df.printSchema
// root
//  |-- someString: string (nullable = true)
//  |-- userId: long (nullable = true)
//  |-- varA: array (nullable = true)
//  |    |-- element: long (containsNull = true)
//  |-- varB: array (nullable = true)
//  |    |-- element: long (containsNull = true)

Теперь мы можем определить zip udf:

import org.apache.spark.sql.functions.{udf, explode}

val zip = udf((xs: Seq[Long], ys: Seq[Long]) => xs.zip(ys))

df.withColumn("vars", explode(zip($"varA", $"varB"))).select(
   $"userId", $"someString",
   $"vars._1".alias("varA"), $"vars._2".alias("varB")).show

// +------+----------+----+----+
// |userId|someString|varA|varB|
// +------+----------+----+----+
// |     1|  example1|   0|   1|
// |     1|  example1|   2|   2|
// |     1|  example1|   5|   9|
// |     2|  example2|   1|   9|
// |     2|  example2|  20|null|
// |     2|  example2|   5|   6|
// +------+----------+----+----+

С сырым SQL:

sqlContext.udf.register("zip", (xs: Seq[Long], ys: Seq[Long]) => xs.zip(ys))
df.registerTempTable("df")

sqlContext.sql(
  """SELECT userId, someString, explode(zip(varA, varB)) AS vars FROM df""")
-1
задан Pritam Banerjee 15 January 2019 в 22:43
поделиться

2 ответа

Математическое манипулирование значениями даты / времени неосведомлено и, возможно, является худшим, что вы можете сделать. Существует множество правил, которые окружают манипуляции с датой и временем, которые лучше оставить достойному и хорошо протестированному API.

Начиная с Java 8, вы должны использовать API java.time или его бэкпорт для более ранних версий.

Например ...

Instant now = Instant.now();
Instant then = now.minus(2, ChronoUnit.DAYS);

System.out.println(Duration.between(then, now).toHours());

который печатает 48

0
ответ дан MadProgrammer 15 January 2019 в 22:43
поделиться

Получите разницу в секундах, а затем просто конвертируйте секунды в часы.

var startDate = new Date();
var endDate = new Date();
var seconds = (endDate.getTime() - startDate.getTime()) / 1000;
// 3.557 seconds difference between the two times
var hourDiff = seconds / 60 / 60;
// 0.0009880555555555556 hours..

Завернуто в функцию:

function getHourDiff(date1, date2) {
    var seconds = (date1.getTime() - date2.getTime()) / 1000;
    return seconds / 60 / 60;
}
0
ответ дан iCodeOneHanded 15 January 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: