我在Java中有一些第三方数据库客户端库。我想通过
访问它们java_gateway.py
例如:通过java网关使python客户端可以使用客户端类(不是jdbc驱动程序!):
java_import(gateway.jvm, "org.mydatabase.MyDBClient")
目前尚不清楚将第三方库添加到jvm类路径的位置。我试图添加到compute-classpath.sh,但这似乎没有用:我得到
Py4jError: Trying to call a package
此外,与Hive进行比较时:hive jar文件不是通过compute-classpath.sh加载的,所以这让我很怀疑。似乎还有一些其他机制可以设置jvm side classpath。
答案 0 :(得分:24)
您可以将外部jar作为参数添加到pyspark
pyspark --jars file1.jar,file2.jar
答案 1 :(得分:15)
您可以在运行时使用Spark配置添加jar文件的路径。
以下是一个例子:
conf = SparkConf().set("spark.jars", "/path-to-jar/spark-streaming-kafka-0-8-assembly_2.11-2.2.1.jar")
sc = SparkContext( conf=conf)
有关详细信息,请参阅document。
答案 2 :(得分:10)
使用spark-submit
时,您可以添加param($websiteName, $packOutput)
$website = Get-AzureWebsite -Name $websiteName
# get the scm url to use with MSDeploy. By default this will be the second in the array
$msdeployurl = $website.EnabledHostNames[1]
$publishProperties = @{'WebPublishMethod'='MSDeploy';
'MSDeployServiceUrl'=$msdeployurl;
'DeployIisAppPath'=$website.Name;
'Username'=$website.PublishingUsername;
'Password'=$website.PublishingPassword}
Write-Output "Stopping web app..."
Stop-AzureWebsite -Name $websiteName
Write-Output "Publishing web app..."
$publishScript = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts\default-publish.ps1"
Write-Output "Starting web app..."
Start-AzureWebsite -Name $websiteName
. $publishScript -publishProperties $publishProperties -packOutput $packOutput
--jars xxx.jar
或设置环境变量./bin/spark-submit --jars xxx.jar your_spark_script.py
SPARK_CLASSPATH
SPARK_CLASSPATH='/path/xxx.jar:/path/xx2.jar' your_spark_script.py
由pyspark API编写
答案 3 :(得分:5)
例如:您已在名为sparkts的文件夹中解压缩C盘中的jar文件 它的值应该是: C:\ sparkts
答案 4 :(得分:3)
除了可接受的答案,您还可以选择以下选项:
如果您处于虚拟环境中,则可以将其放置在
中例如lib/python3.7/site-packages/pyspark/jars
如果希望Java发现它,则可以将jre的安装位置放在ext/
目录下
答案 5 :(得分:2)
以上所有答案均不适用于我
我与pyspark所做的是
pyspark --py-files /path/to/jar/xxxx.jar
对于Jupyter Notebook:
spark = (SparkSession
.builder
.appName("Spark_Test")
.master('yarn-client')
.config("spark.sql.warehouse.dir", "/user/hive/warehouse")
.config("spark.executor.cores", "4")
.config("spark.executor.instances", "2")
.config("spark.sql.shuffle.partitions","8")
.enableHiveSupport()
.getOrCreate())
# Do this
spark.sparkContext.addPyFile("/path/to/jar/xxxx.jar")
链接到我找到它的源: https://github.com/graphframes/graphframes/issues/104
答案 6 :(得分:1)
您可以做的另一件事是将Jar添加到安装pyspark的pyspark jar文件夹中。通常是/python3.6/site-packages/pyspark/jars
如果使用的是虚拟环境,请小心,jar需要在虚拟环境中转到pyspark安装。
这样,您可以使用jar而不用在命令行中发送它或将其加载到代码中。
答案 7 :(得分:1)
我已通过将罐子放入目录驱动程序中,然后在conf文件夹中创建spark-defaults.conf文件来解决此问题。遵循的步骤;
To get the conf path:
cd ${SPARK_HOME}/conf
vi spark-defaults.conf
spark.driver.extraClassPath /Users/xxx/Documents/spark_project/drivers/*
运行Jupyter笔记本。
答案 8 :(得分:0)
java / scala库--jars
和spark.jars
在2.4.0及更低版本中均不起作用(我没有检查较新的版本)。我很惊讶有很多人声称它正在工作。
主要问题是通过以下方式检索的类加载器:
jvm = SparkSession.builder.getOrCreate()._jvm
clazz = jvm.my.scala.class
# or
clazz = jvm.java.lang.Class.forName('my.scala.class')
仅当您将jar文件复制到$ {SPARK_HOME} / jars时,此功能才有效(此功能对我有用)。
但是,当您唯一的方法是使用--jars
或spark.jars
时,将使用另一个在当前线程中设置的类加载器(即子类加载器)。因此,您的python代码应类似于:
clazz = jvm.java.lang.Thread.currentThread().getContextClassLoader().loadClass(f"{object_name}$")
希望它可以说明您的麻烦。如果没有,就给我喊。