【总结2】PySpark的DataFrame时间序列处理
(2017-11-15 15:30:50)
标签:
pysparkdataframewindowgroupby |
分类: 【python与Anaconda科学计算】 |
最近钻研较为繁琐的按时间合并问题,接着先前的经验(【总结】PySpark的DataFrame处理方法:增删改差),对于按某几列加按周groupby的需求,pyspark的dataframe可以这么实现:
(合法的时间间隔可以是这样‘1 second’, ‘1 day 12 hours’, ‘2
minutes’。支持的时间类型如下:‘week’, ‘day’, ‘hour’, ‘minute’, ‘second’,
‘millisecond’, ‘microsecond’. )
from pyspark.sql.functions
import window
win_monday =
window("col1", "1 week",
startTime="4 day")
grouped_data
|
如上红色部分标识,我们得到的数据中col1列是一个'date'类型的列,对它可以进行按时间合并。这里有几个技巧点:
1、起始点是 1970年1月1日
8点0分0秒 星期四 。
这意味着什么呢?
意味着如果按周来groupby,那么它把
这周四的早上8点 到
下周四的早上8点,作为一个时间窗来groupby。当我们遇到需要按照
周一
到 下周一 作为时间窗的需求该怎么办呢?
这时候就需要对时间窗的起始点进行平移,平移可以是增平移,也可以是减平移:
例:假设我们要移动到周一早上00:00:00,那么我们可以这么设置startTime:
from pyspark.sql.functions
import window
win_monday =
window("col1", "1 week",
startTime="4 day -8 hour 0 minute 0
second")
grouped_data =
df.groupBy([df.col2, df.col3, df.col4, win_monday])
df =
grouped_data.sum('col_val')
|
这样设置以后,起始时间窗就变成了:1970-01-05
00:00:00 Monday
2、我想对合并后的时间窗起始点进行join操作怎么办呢?
有时候我们会遇到这样一个需求:当按周进行groupby并sum求和某列col_val以后,需要按照时间把另一个表的某col_a减去col_val。对应时间上的列减去对应时间上的另一列,自然而然想到join。然后发现groupby出来的window列,不是一个date类型,这怎么join。所以这个window列是个什么类型呢?
我们打印出来
发现它是一个类型。这就好办了,用正常取dict的方法,取出数据就行。这个一个Row,里面有2个元素分别是start和end,进一步详细打印我们发现它是这样的:
Row(start=datetime.datetime(2017, 7, 3, 0, 0),
end=datetime.datetime(2017, 7, 10, 0, 0))
所以当我们需要取start或者end的时候,直接这样
row['window']['start']
就可以了。