加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【总结2】PySpark的DataFrame时间序列处理

(2017-11-15 15:30:50)
标签:

pyspark

dataframe

window

groupby

分类: 【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 = df.groupBy([df.col2, df.col3, df.col4, win_monday])

  如上红色部分标识,我们得到的数据中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']

  就可以了。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有