我正在尝试处理包含start_time
和end_time
行的csv以获取并发会话数。我想对按时间戳排序的数据进行单次传递迭代,并维护一个类似累加器的变量来保持活动会话的数量,然后进行其他一些处理。为了保持累加器的准确性,我需要确保在整个RDD上保证顺序(因此我不能使用map
或forEach
)。
数据库足够小,不能对此操作进行并行化,但要足够大,以至于它不适合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