Cách hoạt động mapValues() trên Spark RDD

python
spark

(Nobita) #1

em đang học lập trình spark, có nhiều chỗ em không hiểu mong mọi người giải thích giúp ạ.

def sort_friends(itr):
  result = []

  for friend in itr:
    result.append(friend)
    result.sort(compare_friends)
    result = result[:10]
  return result

def compare_friends(f1, f2):
  result = f2[1] - f1[1]
  if result == 0:
    result = f1[0] - f2[0]
  return result

counts dữ liệu có dạng như thế này:

(0, [(3926, 1), (12570, 2), (3574, 1), (27736, 1)])
(1, [(89, 1), (57, 1), (41457, 1), (5, 2), (77, 1), (63, 1), (27, 1)])
(2, [(64, 1), (36, 1), (8, 1), (94, 1), (34, 1), (6, 1), (12, 1), (92, 1)])

em trích tạm , vì nó nhiều ạ

rec = counts.mapValues(lambda v: sort_friends(v))

kết quả của rec là sắp xếp các cái list trong mỗi tuple theo giá trị 1,2… là số thứ 2 của mỗi cái tuple trong list.


(Hung) #2

counts của bạn là PairRDD.

Bình thường map chỉ thao tác trên từng element trong RDD. Tuy nhiên, PairRDD có 2 giá trị key và value nên có map tương ứng cho value là mapValues

Bạn truyền sort_friends là argument mapValues() thì nó sắp xếp trên value của PairRDD counts thôi.


Riêng sort_friends, mình thấy thừa ở chỗ sort trong for, thử code này chạy không.

def sort_friends(itr):
  result = itr[:]
  result.sort(compare_friends)
  result = result[:10]
  return result

Mình dùng Spark trên Scala, chưa thử Python bao giờ.


(Nobita) #3

result = itr[:] lệnh này là sao ạ.


(HK boy) #4

Copy lại giá trị của một list.

Có vẻ như bạn phải học kĩ về list trong Python rồi.


(Nobita) #5

vâng ạ, em cám ơn a.


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?