2016-03-15 19 views
10

Tôi đã tìm kiếm một thời gian nếu có bất kỳ cách nào để sử dụng lớp Scala trong Pyspark và tôi chưa tìm thấy bất kỳ tài liệu nào cũng như hướng dẫn về chủ đề này.Cách sử dụng lớp Scala bên trong Pyspark

Hãy nói rằng tôi có thể tạo một lớp đơn giản trong Scala có sử dụng một số thư viện của apache-spark, một cái gì đó như:

class SimpleClass(sqlContext: SQLContext, df: DataFrame, column: String) { 
    def exe(): DataFrame = { 
    import sqlContext.implicits._ 

    df.select(col(column)) 
    } 
} 
  • Có cách nào có thể sử dụng lớp này trong Pyspark?
  • Có quá khó khăn không?
  • Tôi có phải tạo tệp .py không?
  • Có hướng dẫn nào cho biết cách thực hiện điều đó không?

Nhân tiện, tôi cũng đã xem mã spark và tôi cảm thấy hơi lạc mất và tôi không có khả năng sao chép chức năng của mình cho mục đích của riêng tôi.

Trả lời

17

Có thể thực hiện được mặc dù có thể xa tầm thường. Thông thường bạn muốn có một trình bao bọc Java (thân thiện), do đó bạn không phải đối phó với các tính năng của Scala mà không thể dễ dàng diễn tả bằng cách sử dụng Java thuần túy và kết quả là không chơi tốt với cổng Py4J.

Giả sử lớp học của bạn là int gói com.example và có Python DataFrame gọi df

df = ... # Python DataFrame 

bạn sẽ phải:

  1. Xây dựng một jar sử dụng your favorite build tool.

  2. Bao gồm nó trong đường dẫn lớp trình điều khiển ví dụ sử dụng đối số --driver-class-path cho vỏ PySpark/spark-submit.Tùy thuộc vào mã chính xác bạn có thể phải vượt qua nó bằng cách sử --jars cũng

  3. Extract dụ JVM từ một trường hợp Python SparkContext:

    jvm = sc._jvm 
    
  4. Extract Scala SQLContext từ một trường hợp SQLContext:

    ssqlContext = sqlContext._ssql_ctx 
    
  5. Trích xuất Java DataFrame từ df:

    jdf = df._jdf 
    
  6. Tạo thể hiện mới của SimpleClass:

    simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v") 
    
  7. Gọi exe phương pháp và quấn kết quả sử dụng Python DataFrame:

    from pyspark.sql import DataFrame 
    
    DataFrame(simpleObject.exe(), ssqlContext) 
    

Kết quả sẽ là một PySpark hợp lệ DataFrame . Bạn có thể kết hợp tất cả các bước vào một cuộc gọi duy nhất.

Quan trọng: Cách tiếp cận này chỉ có thể thực hiện nếu mã Python được thực thi chỉ trên trình điều khiển. Nó không thể được sử dụng bên trong hành động hoặc chuyển đổi Python. Xem How to use Java/Scala function from an action or a transformation? để biết chi tiết.

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