首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将类从一个或多个本地.jar文件导入到Spark/Scala Notebook?

如何将类从一个或多个本地.jar文件导入到Spark/Scala Notebook?
EN

Stack Overflow用户
提问于 2020-09-12 05:40:37
回答 2查看 1.1K关注 0票数 2

我正在努力将JAR中的类加载到我的Scala-Spark内核Jupyter笔记本中。我在这个地方有罐子:

/home/hadoop/src/main/scala/com/linkedin/relevance/isolationforest/

内容如下:

代码语言:javascript
复制
-rwx------ 1 hadoop hadoop   7170 Sep 11 20:54 BaggedPoint.scala
-rw-rw-r-- 1 hadoop hadoop 186719 Sep 11 21:36 isolation-forest_2.3.0_2.11-1.0.1.jar
-rw-rw-r-- 1 hadoop hadoop   1482 Sep 11 21:36 isolation-forest_2.3.0_2.11-1.0.1-javadoc.jar
-rw-rw-r-- 1 hadoop hadoop  20252 Sep 11 21:36 isolation-forest_2.3.0_2.11-1.0.1-sources.jar
-rwx------ 1 hadoop hadoop  16133 Sep 11 20:54 IsolationForestModelReadWrite.scala
-rwx------ 1 hadoop hadoop   5740 Sep 11 20:54 IsolationForestModel.scala
-rwx------ 1 hadoop hadoop   4057 Sep 11 20:54 IsolationForestParams.scala
-rwx------ 1 hadoop hadoop  11301 Sep 11 20:54 IsolationForest.scala
-rwx------ 1 hadoop hadoop   7990 Sep 11 20:54 IsolationTree.scala
drwxrwxr-x 2 hadoop hadoop    157 Sep 11 21:35 libs
-rwx------ 1 hadoop hadoop   1731 Sep 11 20:54 Nodes.scala
-rwx------ 1 hadoop hadoop    854 Sep 11 20:54 Utils.scala

当我尝试加载IsolationForest类时,如下所示:

import com.linkedin.relevance.isolationforest.IsolationForest

我的笔记本中出现以下错误:

代码语言:javascript
复制
<console>:33: error: object linkedin is not a member of package com
       import com.linkedin.relevance.isolationforest.IsolationForest

我已经在谷歌上搜索了几个小时,以达到这一点,但无法进一步发展。下一步是什么?

顺便说一下,我正在尝试使用这个包:https://github.com/linkedin/isolation-forest

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-09-16 00:54:50

对于Scala:

如果您使用的是spylon-kernel,那么您可以在%%init_spark部分中指定额外的jar,如described in the docs (第一个用于jar文件,第二个用于包,如下所述):

代码语言:javascript
复制
%%init_spark
launcher.jars = ["/some/local/path/to/a/file.jar"]
launcher.packages = ["com.acme:super:1.0.1"]

对于Python:

在Jupyter notebook的第一个单元格中,在初始化SparkSession之前,执行以下操作:

代码语言:javascript
复制
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--jars <full_path_to>/isolation-forest_2.3.0_2.11-1.0.1.jar pyspark-shell'

这会将jars添加到PySpark上下文中。但最好使用--packages而不是--jars,因为它还会获取所有必要的依赖项,并将所有内容放入内部缓存中。例如

代码语言:javascript
复制
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.linkedin.isolation-forest:isolation-forest_2.3.0_2.11:1.0.0 pyspark-shell'

您只需要选择与您的PySpark和Scala版本匹配的版本(2.3.x和2.4是Scala 2.11,3.0是Scala 2.12),作为it's listed in the Git repo

票数 2
EN

Stack Overflow用户

发布于 2020-12-21 23:45:55

我在纯Scala、Jupyter Lab和Almond上使用了以下工具,它们使用Ammonite,不涉及Spark或任何其他繁重的覆盖:

代码语言:javascript
复制
interp.load.cp (os.pwd/"yourfile.jar")

上面的代码直接作为语句添加到notebook中,从当前目录加载yourfile.jar。在此之后,您可以从jar导入。例如,如果yourfile是顶级包的名称,则为import yourfile._。我注意到一个警告,在尝试加载之前,应该等待一段时间,直到内核正确启动。如果第一条语句运行得太快(例如,使用restart和run all),那么whol就会挂起。这似乎是一个无关的问题。

当然,您可以构造另一个路径(look over here for the available API)。此外,在上面的ammonite magic imports link下,您还可以找到有关如何从ivy加载包或如何加载Scala脚本的信息。诀窍是使用interp对象和您可以从它访问的LoadJar特征。LoadJar的接口如下:

代码语言:javascript
复制
trait LoadJar {

  /**
   * Load a `.jar` file or directory into your JVM classpath
   */
  def cp(jar: os.Path): Unit
  /**
    * Load a `.jar` from a URL into your JVM classpath
    */
  def cp(jar: java.net.URL): Unit
  /**
   * Load one or more `.jar` files or directories into your JVM classpath
   */
  def cp(jars: Seq[os.Path]): Unit
  /**
   * Load a library from its maven/ivy coordinates
   */
  def ivy(coordinates: Dependency*): Unit
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63854636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档