2016-03-15 14 views
10

Szukałem od jakiegoś czasu, jeśli jest jakiś sposób, aby użyć klasy Scala w Pyspark i nie znalazłem żadnej dokumentacji ani przewodnika na ten temat.Jak korzystać z klasy Scala w Pyspark

Powiedzmy utworzyć prostą klasę w Scala który używa niektórych bibliotek apache-spark, coś takiego:

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

    df.select(col(column)) 
    } 
} 
  • Czy istnieje jakikolwiek sposób, aby użyć tej klasy w Pyspark?
  • Czy to zbyt trudne?
  • Czy muszę utworzyć plik .py?
  • Czy jest jakiś przewodnik, który pokazuje, jak to zrobić?

Przy okazji również sprawdziłem kod spark i czułem się trochę zagubiony, a ja nie mogłem odtworzyć ich funkcjonalności w moim własnym celu.

Odpowiedz

17

Tak, jest to możliwe, chociaż może być dalekie od błahego. Zazwyczaj potrzebujesz przyjaznego dla Javy wrappera, więc nie musisz zajmować się funkcjami Scala, których nie można łatwo wyrazić przy pomocy zwykłej Javy, a w rezultacie nie działają dobrze z bramą Py4J.

Zakładając, że klasa jest int pakietu com.example i mieć Python DataFrame nazwie df

df = ... # Python DataFrame 

musisz:

  1. Budowanie słoik przy użyciu your favorite build tool.

  2. Umieść go w ścieżce klasy sterownika, na przykład za pomocą argumentu --driver-class-path dla PySpark shell/spark-submit.W zależności od dokładnego kodu może trzeba przekazać go za pomocą --jars także

  3. Extract instancji JVM z Python SparkContext przykład:

    jvm = sc._jvm 
    
  4. Extract Scala SQLContext z SQLContext przykład:

    ssqlContext = sqlContext._ssql_ctx 
    
  5. Wyciąg Java DataFrame z df:

    jdf = df._jdf 
    
  6. Utwórz nową instancję SimpleClass:

    simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v") 
    
  7. zadzwonić exe metody i zawijać wynik przy użyciu Pythona DataFrame:

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

Wynik powinien być ważny PySpark DataFrame . Możesz oczywiście połączyć wszystkie kroki w jedno połączenie.

Ważne: To podejście jest możliwe tylko wtedy, gdy kod Pythona jest wykonywany wyłącznie w sterowniku. Nie można go używać w akcji lub transformacji Pythona. Szczegółowe informacje można znaleźć na stronie How to use Java/Scala function from an action or a transformation?.

Powiązane problemy