2015-10-08 20 views
22

Có thể chuyển các đối số thừa vào hàm ánh xạ trong pySpark không? Cụ thể, tôi có phương pháp mã sau:Spark RDD - Ánh xạ với các đối số thừa

raw_data_rdd = sc.textFile("data.json", use_unicode=True) 
json_data_rdd = raw_data_rdd.map(lambda line: json.loads(line)) 
mapped_rdd = json_data_rdd.flatMap(processDataLine) 

Chức năng processDataLine mất lập luận thêm ngoài các đối tượng JSON, như:

def processDataLine(dataline, arg1, arg2) 

Làm thế nào tôi có thể vượt qua các đối số phụ arg1arg2 để chức năng flaMap?

+0

Hãy xem xét đọc [này] (http://stackoverflow.com/questions/26959221/pyspark-broadcast-variables-from-local-functions) –

+0

Cảm ơn @AvihooMamka. Như tôi đã hiểu, tôi cần sử dụng một phần chức năng. Nhưng tôi đã không làm thế nào để áp dụng nó cho trường hợp của tôi? –

+1

Tại sao không gửi cho hàm một phần chức năng processDataLine và các đối số bạn muốn sau khi phát nó? –

Trả lời

31
  1. Bạn có thể sử dụng một chức năng ẩn danh hoặc trực tiếp trong một flatMap

    json_data_rdd.flatMap(lambda j: processDataLine(j, arg1, arg2)) 
    

    hoặc cà ri processDataLine

    f = lambda j: processDataLine(dataline, arg1, arg2) 
    json_data_rdd.flatMap(f) 
    
  2. Bạn có thể tạo processDataLine như thế này:

    def processDataLine(arg1, arg2): 
        def _processDataLine(dataline): 
         return ... # Do something with dataline, arg1, arg2 
        return _processDataLine 
    
    json_data_rdd.flatMap(processDataLine(arg1, arg2)) 
    
  3. toolz thư viện cung cấp hữu ích curry trang trí:

    from toolz.functoolz import curry 
    
    @curry 
    def processDataLine(arg1, arg2, dataline): 
        return ... # Do something with dataline, arg1, arg2 
    
    json_data_rdd.flatMap(processDataLine(arg1, arg2)) 
    

    Lưu ý rằng tôi đã đẩy dataline tranh luận với vị trí cuối cùng. Nó không phải là bắt buộc nhưng theo cách này chúng ta không phải sử dụng từ khóa args.

  4. Cuối cùng có functools.partial đã được đề cập bởi Avihoo Mamka trong các nhận xét.

+0

hiệu suất, giải pháp nào là tốt nhất? – guilhermecgs

+1

@guilhermecgs Bạn có thể đánh giá này trên bộ sưu tập cục bộ nhưng rõ ràng làm tổ (2.) nên hiệu quả nhất theo sau bằng cách sử dụng chức năng ẩn danh (1.) Currying/partials có thể hơi chậm hơn vì cơ chế phức tạp hơn nhiều so với trước đó. Không phải là tôi sẽ thực sự lo lắng về nó ở đây. – zero323

Các vấn đề liên quan