在 Scala 中将 BIGINT 转换为 TIMESTAMP

Posted

技术标签:

【中文标题】在 Scala 中将 BIGINT 转换为 TIMESTAMP【英文标题】:Convert BIGINT to TIMESTAMP in Scala 【发布时间】:2018-02-21 20:50:35 【问题描述】:

在将 BIGINT 转换为 TIMESTAMP 时,垃圾值即将到来。请参阅下面的查询。 感谢任何帮助。

scala> spark.sql("select cast(cast(cast(CAST('2015-11-15 18:15:06.51' AS TIMESTAMP) as double)*1000 + cast('64082' as double) as bigint) as timestamp) " ).show(truncate=false)
+-----------------------------------------------------------------------------------------------------------------------------------------------+
|CAST(CAST(((CAST(CAST(2015-11-15 18:15:06.51 AS TIMESTAMP) AS DOUBLE) * CAST(1000 AS DOUBLE)) + CAST(64082 AS DOUBLE)) AS BIGINT) AS TIMESTAMP)|
+-----------------------------------------------------------------------------------------------------------------------------------------------+
|47843-07-20 09:36:32.0                                                                                                                         |
+-----------------------------------------------------------------------------------------------------------------------------------------------+

【问题讨论】:

为什么结果是“垃圾值”?你期待什么结果?而且,更重要的是,您做了什么来证明(通过非常简单的代码示例)预期结果实际上是一个合理的预期? 【参考方案1】:

使用 Spark 1.6

将 TIMESTAMP 类型转换为 DOUBLE 将转换为秒 1970-01-01。 将 BIGINT 类型转换为 TIMESTAMP 将从 自 1970 年 1 月 1 日以来的秒数。

您的示例似乎暗示您认为将 BIGINT 转换为 TIMESTAMP 会从 1970-01-01 以来的毫秒数转换,但事实并非如此。所以你最终会得到一个垃圾值。

请注意,根据这张票,行为实际上是可配置的:https://issues.apache.org/jira/browse/HIVE-3454

【讨论】:

【参考方案2】:

将 bigint 转换为 timestamp 以秒为单位接收纪元时间。 尝试不乘以 1000:

select cast(cast(cast(CAST('2015-11-15 18:15:06.51' AS TIMESTAMP) as double) + cast('64082' as double) as bigint) as timestamp)

虽然这会降低毫秒精度。

【讨论】:

以上是关于在 Scala 中将 BIGINT 转换为 TIMESTAMP的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中将 BigInt 转换为 Number?

在 MSSQL 中将 bigint 转换为 varchar

如何在 Redshift 中将 BIGINT 转换为 DATE?

在Postgres中将十六进制字符串转换为bigint [重复]

在 SQL Server 中将 int 主键转换为 bigint

在 Scala 中将 JSON 转换为 CSV?