Scala 为什么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

在Spark中,您可以将
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)