1. python 直接訪問 jar 里面的類
先定義java文件,然后要訪問java class, 需要有gateway server 和 entrypoint, 到時候python就可以連接上gateway server訪問java object了.具體參考這里 python 怎么調用 java https://www.py4j.org/getting_started.html 用 py4J 作為中間gateway.
2. pyspark 訪問jar里面的類
上面講的是python怎么訪問java對象,如果從pyspark 訪問java對象就簡單多了,因為pyspark會幫你自動創建好gateway server, 所有你的java code 就不需要寫gateway server了. 但是pyspark 這端還是需要有專門的code去連接 gateway server的. 示例代碼如下.
In PySpark try the following
pyspark --driver-class-path my-test-1.0-SNAPSHOT.jar
from py4j.java_gateway import java_import java_import(sc._gateway.jvm,"org.foo.module.Foo") func = sc._gateway.jvm.Foo() func.fooMethod()
# 也可以這樣
sc._jvm.com.mycompany.app.Stack().my_open()
# 感覺 sc._jvm 和 sc._gateway.jvm 是一樣的效果
具體參考這里 pyspark 怎么import java https://stackoverflow.com/questions/33544105/running-custom-java-class-in-pyspark
那么問題來了,可不可以在pyspark 這端可不要這么麻煩的,直接像引用Python module 一樣 import xxx_module 這樣不是更好嗎?
3. 怎么在pyspark里直接import jar 里面的class
基於上面的疑問,看 delta lake的官方示例代碼的時候有個疑問,人家怎么做到的?
所以就去下載了 io.delta_delta-core_2.11-0.5.0.jar 這個包解壓開看了下,才明白,它是在包內部准備好了python文件,直接import的是pyhon 代碼當然沒問題了.