我有一个PySpark数据帧(df
),有三列。你知道吗
1。
category
:一些字符串
2。
startTimeArray
:它是一个数组,包含按升序排列的时间戳。你知道吗
三。
endTimeArray
:它是一个数组,包含按升序排列的时间戳。你知道吗
在每一行中,startTimeArray
中的数组长度与endTimeArray
中的数组长度相同。对于这些数组中的每个索引,startTimeArray
中给出的时间戳小于endTimeArray
中相应的(相同索引)时间戳(发生在前一个日期)。你知道吗
在列startTimeArray
(和列endTimeArray
)中,数组的长度可以不同。你知道吗
以下是数据帧的示例:
+--------+---------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------+
|category|startTimeArray |endTimeArray |
+--------+---------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------+
|a |[2019-01-10 00:00:00, 2019-01-12 00:00:00, 2019-01-16 00:00:00, 2019-01-20 00:00:00] |[2019-01-11 00:00:00, 2019-01-15 00:00:00, 2019-01-18 00:00:00, 2019-01-22 00:00:00] |
|a |[2019-03-11 00:00:00, 2019-03-18 00:00:00, 2019-03-20 00:00:00, 2019-03-25 00:00:00, 2019-03-27 00:00:00]|[2019-03-16 00:00:00, 2019-03-19 00:00:00, 2019-03-23 00:00:00, 2019-03-26 00:00:00, 2019-03-30 00:00:00]|
|b |[2019-01-14 00:00:00, 2019-01-16 00:00:00, 2019-02-22 00:00:00] |[2019-01-15 00:00:00, 2019-01-18 00:00:00, 2019-02-25 00:00:00] |
+--------+---------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------+
在每一行的startTimeArray
列中,我要确保数组中连续元素(连续索引处的元素)之间的差异至少为三天。如果startTimeArray
中的一行有n
元素,我可以删除数组中的条目,除了第一个条目。此外,如果索引i处的元素从startTimeArray
中的行中删除,我希望索引i-1处的元素从endTimeArray
中的同一行中删除。**
如何使用PySpark完成此任务?你知道吗
我们需要注意的是:
如果startTimeArray
中的数组有一个元素,我们就让它在那里。
我意识到这个任务可以通过删除startTimeArray
中数组中第一个元素之后的所有元素来实现。那将是一个微不足道的例子。但是我想通过尽可能少的删除来完成任务。
下面是我在上面给出的示例dataframe df
中想要的输出。你知道吗
+--------+---------------------------------------------------------------+---------------------------------------------------------------+
|category|startTimeArray |endTimeArray |
+--------+---------------------------------------------------------------+---------------------------------------------------------------+
|a |[2019-01-10 00:00:00, 2019-01-16 00:00:00, 2019-01-20 00:00:00]|[2019-01-15 00:00:00, 2019-01-18 00:00:00, 2019-01-22 00:00:00]|
|a |[2019-03-11 00:00:00, 2019-03-18 00:00:00, 2019-03-25 00:00:00]|[2019-03-16 00:00:00, 2019-03-23 00:00:00, 2019-03-30 00:00:00]|
|b |[2019-01-14 00:00:00, 2019-02-22 00:00:00] |[2019-01-18 00:00:00, 2019-02-25 00:00:00] |
+--------+---------------------------------------------------------------+---------------------------------------------------------------+
用户定义函数(UDF)可以完成这项工作。虽然与本机sparksql函数相比,它会带来性能损失,但它清楚地表达了所需的操作。你知道吗
相关问题 更多 >
编程相关推荐