订购单程pyspark

时间:2016-07-13 20:48:42

标签: python apache-spark pyspark

我正在尝试处理包含start_timeend_time行的csv以获取并发会话数。我想对按时间戳排序的数据进行单次传递迭代,并维护一个类似累加器的变量来保持活动会话的数量,然后进行其他一些处理。为了保持累加器的准确性,我需要确保在整个RDD上保证顺序(因此我不能使用mapforEach)。

数据库足够小,不能对此操作进行并行化,但要足够大,以至于它不适合RAM。 toLocalIterator()实际上做了我想要的,但我无法弄清楚之后如何进行并行操作。

谢谢!

示例代码:

concurrent = 0 
sessions = sc.parallelize([
    {start_time: '2016-01-01T00:00:00.000Z', end_time: '2016-01-01T00:01:00.000Z'}, ... ]) 
events = sessions.flatMap(separate_end_time).sortBy(lambda x: x['timestamp']) 
    # RDD [{timestamp: '2016-01-01T00:00:00.000Z', change: 1}, 
    #      {timestamp: '2016-01-01T00:10:00.000Z', change: -1}, ...] 

events.forEach(apply_accumulator)   # <- replace this forEach!

def apply_accumulator(session): 
    global concurrent  
    concurrent += change 
    session['concurrent'] = concurrent

0 个答案:

没有答案