【问题标题】:pyspark: rdd operation for timestepspyspark:时间步长的rdd操作
【发布时间】:2020-03-06 17:15:25
【问题描述】:

我的文件格式如下,

0, Alpha,-3.9, 4, 2001-02-01 08:00:00, 5, 20
0, Beta, -3.8, 3, 2001-02-01 08:15:00, 6, 21
1, Gamma,-3.7, 8, 2001-02-01 08:30:00, 7, 22
0, Alpha,-3.5, 4, 2001-02-01 08:45:00, 8, 23
0, Alpha,-3.9, 4, 2001-02-01 09:00:00, 8, 27
0, Gamma,-3.5, 5, 2001-02-01 09:15:00, 6, 21

等等…… 例如,对于给定的Alpha/Beta/Gamma,我对sum of 5th element 中的sum of 5th element 感兴趣,时间间隔在08:00:00 to 09:00:00 之间。我希望仅使用基于rdd 的操作between 08:00:00 to 09:00:00 获得以下结果。

Alpha 21
Beta 6
Gamma 7

这就是我目前所做的;

rdd = sc.textFile(myDataset)
newrdd = rdd.map(myFun) # myFun process each line 
filterrdd = newrdd.filter(lambda e : e[4].startswith('2001-02-01') )

但我不知道如何继续。或者至少看不到仅使用基于rdd 的操作来解决它的简单方法。

【问题讨论】:

    标签: python python-3.x pyspark bigdata rdd


    【解决方案1】:

    要过滤 08:00:00-09:00:00(含)之间的时间,您只需要确保此字符串的时间部分以 08:09:00:00 开头,因此您的过滤功能可以是e[4].split()[1].startswith(('08:', '09:00:00'))。然后你可以做常规的 RDD reduceByKey() 等。

    newrdd.filter(lambda e: e[4].split()[1].startswith(('08:', '09:00:00'))) \
          .map(lambda e: (e[1], int(e[5]))) \
          .reduceByKey(lambda x,y: x+y) \
          .collect()
    #[(' Alpha', 21), (' Beta', 6), (' Gamma', 7)]
    

    【讨论】:

    • 感谢 jxc。它有助于。如果我想从 08 到 12:00:00 以一小时为单位进行,我应该如何修改?
    • @Mass17,你是什么意思in step of one hour,你能添加一个预期结果的样本吗?
    • 从 08:00:00 到 12:00:00,然后是 ('08' <= e[4].split()[1][:2] <= '11') | (e[4].split()[1] == '12:00:00')
    • 或转换为 datetime.time 对象来处理任何时间范围。
    • 我的意思是 [('Alpha', ), ('Beta',), ('Gamma', )] 8-9 之间, [(' Alpha', *), ('Beta',), ('Gamma', )] 9-10之间, [('Alpha', *), ('Beta', ), ('Gamma', *)] 10-11 之间等等..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-02-26
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多