Scala 为什么spark中不允许从长期到现在进行铸造?
在Spark中,您可以将Scala 为什么spark中不允许从长期到现在进行铸造?,scala,date,apache-spark,timestamp,Scala,Date,Apache Spark,Timestamp,在Spark中,您可以将LongType转换为TimestampType,而不会出现问题。在这之后,将时间类型转换为日期类型就没有问题了 流动 long -> timestamp -> date 因此是可能的。但是,无法将LongType直接转换为DateType。 所以 这是不允许的 在内部,TimestampType只是一个long,DateType只是一个int 因此 long -> long -> int // this is fine long -> i
LongType
转换为TimestampType
,而不会出现问题。在这之后,将时间类型
转换为日期类型
就没有问题了
流动
long -> timestamp -> date
因此是可能的。但是,无法将LongType
直接转换为DateType
。
所以
这是不允许的
在内部,TimestampType
只是一个long
,DateType
只是一个int
因此
long -> long -> int // this is fine
long -> int // this is not fine
为什么呢?为什么spark不允许直接从
长
到日期
?对于初学者来说模棱两可。此外,内部表示并不反映外部表示(时间戳具有毫秒精度,而在转换过程中的长时间被解释为秒)。那么,为什么从长时间转换到时间戳不会导致任何问题呢?当然,时间戳有毫秒精度,日期有天精度。但是长就是长。因此,无论long被转换为什么,都必须有某种明确的转换。。。为什么没有一个用于long->date
,因为无论timestamp
是否介于两者之间,它本质上仍然是一种信息丢失?如果您正在寻找一个无法完成的严格原因,我想没有。实际上,我们有以(毫秒)为单位表示时间戳的成熟约定,但不是以天为单位。歧义也是一个问题——我们应该将整数解释为(毫秒)秒还是天?您还可以检查内部表示是否不相关,因为内部表示无论如何都不会直接使用。
val DEFAULT_DATE_FORMAT: String = "yyyy-MM-dd"
val unixDate: Date = new Date(if (ts > Int.MaxValue) ts else ts * 1000)
val dateFormatter: SimpleDateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT)
val date: String = dateFormatter.format(unixDate)
val DEFAULT_DATE_FORMAT: String = "yyyy-MM-dd"
val unixDate: Date = new Date(if (ts > Int.MaxValue) ts else ts * 1000)
val dateFormatter: SimpleDateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT)
val date: String = dateFormatter.format(unixDate)