scala - Spark scala - 计算动态时间戳间隔
问题描述
有一个带有时间戳列(时间戳类型)的数据框,称为“maxTmstmp”,另一个带有小时的列,表示为称为“WindowHours”的整数。我想动态减去时间戳和整数列以获得更低的时间戳。
我的数据和预期效果(“minTmstmp”列):
+-----------+-------------------+-------------------+
|WindowHours| maxTmstmp| minTmstmp|
| | |(maxTmstmp - Hours)|
+-----------+-------------------+-------------------+
| 1|2016-01-01 23:00:00|2016-01-01 22:00:00|
| 2|2016-03-01 12:00:00|2016-03-01 10:00:00|
| 8|2016-03-05 20:00:00|2016-03-05 12:00:00|
| 24|2016-04-12 11:00:00|2016-04-11 11:00:00|
+-----------+-------------------+-------------------+
root
|-- WindowHours: integer (nullable = true)
|-- maxTmstmp: timestamp (nullable = true)
我已经找到了一个带有小时间隔解决方案的表达式,但它不是动态的。下面的代码不能按预期工作。
standards.
.withColumn("minTmstmp", $"maxTmstmp" - expr("INTERVAL 10 HOURS"))
.show()
在 Spark 2.4 和 scala 上运行。
解决方案
一种简单的方法是转换maxTmstmp
为unix time,从中减去WindowHours
以秒为单位的值,然后将结果转换回 Spark Timestamp
,如下所示:
import java.sql.Timestamp
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
(1, Timestamp.valueOf("2016-01-01 23:00:00")),
(2, Timestamp.valueOf("2016-03-01 12:00:00")),
(8, Timestamp.valueOf("2016-03-05 20:00:00")),
(24, Timestamp.valueOf("2016-04-12 11:00:00"))
).toDF("WindowHours", "maxTmstmp")
df.withColumn("minTmstmp",
from_unixtime(unix_timestamp($"maxTmstmp") - ($"WindowHours" * 3600))
).show
// +-----------+-------------------+-------------------+
// |WindowHours| maxTmstmp| minTmstmp|
// +-----------+-------------------+-------------------+
// | 1|2016-01-01 23:00:00|2016-01-01 22:00:00|
// | 2|2016-03-01 12:00:00|2016-03-01 10:00:00|
// | 8|2016-03-05 20:00:00|2016-03-05 12:00:00|
// | 24|2016-04-12 11:00:00|2016-04-11 11:00:00|
// +-----------+-------------------+-------------------+
推荐阅读
- android - 如何使用 Intent.ACTION_OPEN_DOCUMENT 过滤 JSON 文件?
- reactjs - 如何将 SVG 源解析为 React 节点?
- javascript - 数组的长度属性在 for 循环中无法正常工作
- google-apps-script - 我无法让 Math.max 函数仅返回有效整数#num
- php - 我的 php 文件中的重定向有问题
- flutter - Flutter:缺少静态目标的未实现处理
- javascript - Vue.js - 导入外部 vue 组件
- html - 页面上 33.3333% 的中心元素
- windows - 将选定的文件复制到不同的目录
- javascript - 在 boostrap 模式上并置插件问题,预览太小