Apache spark 在映射操作中发射多对

Apache spark 在映射操作中发射多对,apache-spark,pyspark,Apache Spark,Pyspark,假设我有几行电话通话记录,格式如下: [CallingUser, ReceivingUser, Duration] 如果我想知道某个用户在电话上的总时间(该用户是呼叫者或接收者的持续时间总和) 实际上,对于给定的记录,我想创建两对(CallingUser,Duration)和(ReceivingUser,Duration) 最有效的方法是什么?我可以同时添加2个RDD,但我不清楚这是否是一个好方法: #Sample Data: callData = sc.parallelize([["User

假设我有几行电话通话记录,格式如下:

[CallingUser, ReceivingUser, Duration]
如果我想知道某个用户在电话上的总时间(该用户是呼叫者或接收者的持续时间总和)

实际上,对于给定的记录,我想创建两对
(CallingUser,Duration)
(ReceivingUser,Duration)

最有效的方法是什么?我可以同时添加2个
RDD
,但我不清楚这是否是一个好方法:

#Sample Data:
callData = sc.parallelize([["User1", "User2", 2], ["User1", "User3", 4], ["User2", "User1", 8]  ])


calls = callData.map(lambda record: (record[0], record[2]))

#The potentially inefficient map in question:
calls += callData.map(lambda record: (record[1], record[2]))


reduce = calls.reduceByKey(lambda a, b: a + b)

你想要平面图。如果您编写了一个函数,返回列表
[(记录[0],记录[2]),(记录[1],记录[2])]
,那么您就可以平面映射它了

使用flatMap(),它适用于获取单个输入和生成多个映射输出。完整的代码:

callData = sc.parallelize([["User1", "User2", 2], ["User1", "User3", 4], ["User2", "User1", 8]])

calls = callData.flatMap(lambda record: [(record[0], record[2]), (record[1], record[2])])
print calls.collect()
# prints [('User1', 2), ('User2', 2), ('User1', 4), ('User3', 4), ('User2', 8), ('User1', 8)]

reduce = calls.reduceByKey(lambda a, b: a + b)
print reduce.collect()
# prints [('User2', 10), ('User3', 4), ('User1', 14)]

是否提供执行此操作的代码行?谢谢