2015-02-27 20 views
7

Hãy nói rằng tôi có hàng gọi điện thoại ghi lại định dạng:Phát ra nhiều cặp đi vào hoạt động bản đồ

[CallingUser, ReceivingUser, Duration] 

Nếu tôi muốn biết tổng số thời gian mà một người dùng nhất định đã được trên điện thoại (tổng của Thời lượng mà Người dùng là Người gọi hoặc Người nhận).

Có hiệu quả, đối với một bản ghi nhất định, tôi muốn tạo 2 cặp (CallingUser, Duration)(ReceivingUser, Duration).

Cách hiệu quả nhất để thực hiện việc này là gì? Tôi có thể thêm 2 RDDs cùng nhau, nhưng tôi không rõ liệu đây có phải là cách tiếp cận tốt hay không:

#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) 

Trả lời

10

Bạn muốn bản đồ phẳng. Nếu bạn viết một hàm trả về danh sách [(record[0], record[2]),(record[1],record[2])] thì bạn có thể căn bản đồ đó!

+4

Chăm sóc để cung cấp dòng mã để thực hiện việc này? Cảm ơn. –

6

Sử dụng flatMap() phù hợp cho việc lấy các đầu vào đơn lẻ và tạo nhiều kết quả được ánh xạ. Hoàn thành với mã:

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)] 
Các vấn đề liên quan