2016-03-15 46 views
10

如果在Pyspark中有任何方法使用Scala類,我一直在尋找一段時間,而且我還沒有找到關於此主題的任何文檔和指南。如何在Pyspark中使用Scala類

比方說,我創建Scala一個簡單的類,它使用的apache-spark一些圖書館,是這樣的:

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

    df.select(col(column)) 
    } 
} 
  • 是否有Pyspark使用這個類的任何可能的方式是什麼?
  • 太難了嗎?
  • 我必須創建.py文件嗎?
  • 有沒有任何指導說明如何做到這一點?

順便說一句,我也看了spark代碼,我覺得有點失落,而且我無法爲自己的目的複製它們的功能。

回答

17

是的,這是可能的,儘管可能是微不足道的。通常情況下,你需要一個Java(友好)包裝器,所以你不必處理Scala特性,這些特性不能用普通的Java來表達,因此在Py4J網關中不能很好地運行。

假設你的類爲int包com.example和安裝Python DataFrame稱爲df

df = ... # Python DataFrame 

你必須:

  1. 構建使用your favorite build tool一個罐子。

  2. 將它包含在驅動程序類路徑中,例如對於PySpark shell/​​使用​​參數。根據確切的代碼,你可以把它用--jars以及

  3. 提取JVM實例從一個Python SparkContext實例經過:

    jvm = sc._jvm 
    
  4. SQLContext實例提取斯卡拉SQLContext

    ssqlContext = sqlContext._ssql_ctx 
    
  5. 提取Java DataFrame來自df

    jdf = df._jdf 
    
  6. 創建新實例:

    simpleObject = jvm.com.example.SimpleClass(ssqlContext, jdf, "v") 
    
  7. 呼叫exe方法和包裝使用Python DataFrame結果:

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

結果應該是一個有效的PySpark DataFrame 。當然,您可以將所有步驟合併爲一個通話。

重要:只有當Python代碼僅在驅動程序上執行時,此方法纔有可能。它不能在Python動作或轉換中使用。詳情請參閱How to use Java/Scala function from an action or a transformation?