拆分时间戳 Spark databricks python SQL
Posted
技术标签:
【中文标题】拆分时间戳 Spark databricks python SQL【英文标题】:Split timestamps Spark databricsk python SQL 【发布时间】:2021-06-09 15:35:13 【问题描述】:我有两列。
Start | Stop |
---|---|
2021-02-02 18:00:000 | 2021-02-03 02:00:00 |
但我需要
Start | Stop |
---|---|
2021-02-02 18:00:000 | 2021-02-02 23:59:59:997 |
2021-02-03 00:00:000 | 2021-02-03 02:00:00 |
我需要计算每天的持续时间。 我尝试使用 Spark SQL 来实现,但没有成功。如果您有任何使用 pyspark 或 Spark sql 的想法,那就太好了。
编辑: 我尝试过使用 concat 和 explode:
Start | Stop |
---|---|
2021-02-02 18:00:00, 2021-02-03 00:00:00 | 2021-02-02 23:59:59, 2021-02-03 02:00:00 |
但我无法分解多个列。
此外,我也有日期范围超过 1 天的情况。
Start | Stop |
---|---|
2021-02-02 18:00:000 | 2021-02-08 02:00:00 |
【问题讨论】:
你能更清楚你想要什么吗?你有columns = ["start", "stop"]
的数据框吗?什么是输入,什么是期望的输出?
火花版本?
这需要在 spark 中完成吗?我们可以使用 pandas 并将其转换为 spark 数据框吗?如果您不打算在输出 df 中包含数百万个条目,那应该是一个可行的解决方案。
我对这些列有一个临时视图。输入 - csv,输出 - 临时视图/数据框。火花版本 3.0.1。它也可以是 pandas 数据框。
【参考方案1】:
检查下面的代码。
df.show(false)
+-------------------+-------------------+
|start |stop |
+-------------------+-------------------+
|2021-02-02 18:00:00|2021-02-03 02:00:00|
+-------------------+-------------------+
df.withColumn("dates",expr("explode(cast(transform(sequence(0,datediff(stop,start)), x -> (case when start > to_timestamp(date_add(start,x)) then start else to_timestamp(date_add(start,x)) end,case when start > to_timestamp(date_add(start,x)) then to_timestamp(unix_timestamp(date_add(start,x+1))-1) else stop end)) as array<struct<start:timestamp,stop:timestamp>>))")).select("dates.*").show(false)
+-------------------+-------------------+
|start |stop |
+-------------------+-------------------+
|2021-02-02 18:00:00|2021-02-02 23:59:59|
|2021-02-03 00:00:00|2021-02-03 02:00:00|
+-------------------+-------------------+
【讨论】:
谢谢,但我有一个临时视图,并且该 scala 代码不可见。我有一个错误“未找到:值 df” 您可以将数据加载到 spark 数据帧中并使用上面的代码。 它可以工作,但我需要 python 或 sql 中的代码。感谢您的帮助。 可以直接在sql中使用expr()
里面的代码。它应该可以工作。以上是关于拆分时间戳 Spark databricks python SQL的主要内容,如果未能解决你的问题,请参考以下文章
Databricks getArgument 值不能在 Spark SQL IN 子句中使用