01/10/2018, 17:30

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

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 viết 19:45 ngày 01/10/2018

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 viết 19:35 ngày 01/10/2018

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

HK boy viết 19:40 ngày 01/10/2018

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 viết 19:35 ngày 01/10/2018

result = itr[:]

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

Bài liên quan
0