Pyspark 为Spark SQL中的每一分钟差异创建一个新行

Pyspark 为Spark SQL中的每一分钟差异创建一个新行,pyspark,apache-spark-sql,pyspark-sql,Pyspark,Apache Spark Sql,Pyspark Sql,以我的数据为例: +---+-------------------+-------------------+ | id| starttime| endtime| +---+-------------------+-------------------+ | 1|1970-01-01 07:00:00|1970-01-01 07:03:00| +---+-------------------+-------------------+ 基于此,我需要一个s

以我的数据为例:

+---+-------------------+-------------------+
| id|          starttime|            endtime|
+---+-------------------+-------------------+
|  1|1970-01-01 07:00:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+
基于此,我需要一个sql查询,该查询为endtime和start time之间的每分钟差异创建一行,以使我的数据以如下方式结束:

+---+-------------------+-------------------+
| id|          starttime|            endtime|
+---+-------------------+-------------------+
|  1|1970-01-01 07:00:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+
|  1|1970-01-01 07:01:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+
|  1|1970-01-01 07:02:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+
|  1|1970-01-01 07:03:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+
我非常喜欢sql,但如果不可能,您可以使用pyspark。

试试以下方法:

import pyspark.sql.functions as f
df.show()
+---+-------------------+-------------------+
| id|          starttime|            endtime|
+---+-------------------+-------------------+
|  1|1970-01-01 07:00:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+

#df.printSchema()
# root
# |-- id: long (nullable = true)
# |-- starttime: timestamp (nullable = true)
# |-- endtime: timestamp (nullable = true)
expr
sequence
与一分钟间隔相结合,将为您提供分钟的时间戳数组,然后将其分解成行进行转换

df.select('id', f.explode(f.expr('sequence(starttime, endtime, interval 1 minute)')).alias('starttime'), 'endtime' ).show(truncate=False)
+---+-------------------+-------------------+
|id |starttime          |endtime            |
+---+-------------------+-------------------+
|1  |1970-01-01 07:00:00|1970-01-01 07:03:00|
|1  |1970-01-01 07:01:00|1970-01-01 07:03:00|
|1  |1970-01-01 07:02:00|1970-01-01 07:03:00|
|1  |1970-01-01 07:03:00|1970-01-01 07:03:00|
+---+-------------------+-------------------+

对于Spark 2.4+,您可以使用函数生成范围日期数组,然后将其分解:

SELECT  id, 
        explode(sequence(to_timestamp(starttime), to_timestamp(endtime), interval 1 minute)) AS starttime,
        endtime
FROM    my_table


df = spark.createDataFrame([(1, "1970-01-01 07:00:00", "1970-01-01 07:03:00")], ["id", "starttime", "endtime"])
df.createOrReplaceTempView("my_table")

sql_query = """SELECT id, 
explode(sequence(to_timestamp(starttime), to_timestamp(endtime), interval 1 minute)) as starttime,
endtime
FROM my_table
"""

spark.sql(sql_query).show()

#+---+-------------------+-------------------+
#| id|          starttime|            endtime|
#+---+-------------------+-------------------+
#|  1|1970-01-01 07:00:00|1970-01-01 07:03:00|
#|  1|1970-01-01 07:01:00|1970-01-01 07:03:00|
#|  1|1970-01-01 07:02:00|1970-01-01 07:03:00|
#|  1|1970-01-01 07:03:00|1970-01-01 07:03:00|
#+---+-------------------+-------------------+

让我们看看你到目前为止尝试了什么,什么不起作用。这就是我来这里的原因。我不知道该怎么做。很好的解决方案,我想出了一个更长更复杂的解决方案,但这更快更切中要害。我会从中学习的谢谢。我不知道函数序列。我设法使用一个使用lambda x:range(x)的udf函数来实现它,但这种方法要好得多。