如何将一个或多个本地.jar文件中的类导入spark/scala笔记本?

ugmeyewa  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(437)

我正在努力将jar中的类加载到scala-spark内核jupyter笔记本中。我在这个地方有jar: /home/hadoop/src/main/scala/com/linkedin/relevance/isolationforest/ 内容如下:

  1. -rwx------ 1 hadoop hadoop 7170 Sep 11 20:54 BaggedPoint.scala
  2. -rw-rw-r-- 1 hadoop hadoop 186719 Sep 11 21:36 isolation-forest_2.3.0_2.11-1.0.1.jar
  3. -rw-rw-r-- 1 hadoop hadoop 1482 Sep 11 21:36 isolation-forest_2.3.0_2.11-1.0.1-javadoc.jar
  4. -rw-rw-r-- 1 hadoop hadoop 20252 Sep 11 21:36 isolation-forest_2.3.0_2.11-1.0.1-sources.jar
  5. -rwx------ 1 hadoop hadoop 16133 Sep 11 20:54 IsolationForestModelReadWrite.scala
  6. -rwx------ 1 hadoop hadoop 5740 Sep 11 20:54 IsolationForestModel.scala
  7. -rwx------ 1 hadoop hadoop 4057 Sep 11 20:54 IsolationForestParams.scala
  8. -rwx------ 1 hadoop hadoop 11301 Sep 11 20:54 IsolationForest.scala
  9. -rwx------ 1 hadoop hadoop 7990 Sep 11 20:54 IsolationTree.scala
  10. drwxrwxr-x 2 hadoop hadoop 157 Sep 11 21:35 libs
  11. -rwx------ 1 hadoop hadoop 1731 Sep 11 20:54 Nodes.scala
  12. -rwx------ 1 hadoop hadoop 854 Sep 11 20:54 Utils.scala

当我尝试这样加载isolationforest类时: import com.linkedin.relevance.isolationforest.IsolationForest 我的笔记本中出现以下错误:

  1. <console>:33: error: object linkedin is not a member of package com
  2. import com.linkedin.relevance.isolationforest.IsolationForest

我已经在google上搜索了好几个小时,想知道这一点,但没法再进一步了。下一步是什么?
顺便说一下,我正在尝试使用这个软件包:https://github.com/linkedin/isolation-forest
谢谢您。

bt1cpqcv

bt1cpqcv1#

对于scala:
如果您使用的是spylon内核,那么可以在 %%init_spark 节,如文档所述(第一个用于jar文件,第二个用于包,如下所述):

  1. %%init_spark
  2. launcher.jars = ["/some/local/path/to/a/file.jar"]
  3. launcher.packages = ["com.acme:super:1.0.1"]

对于python:
在jupyter笔记本的第一个单元格中,在初始化 SparkSession ,请执行以下操作:

  1. import os
  2. os.environ['PYSPARK_SUBMIT_ARGS'] = '--jars <full_path_to>/isolation-forest_2.3.0_2.11-1.0.1.jar pyspark-shell'

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

  1. import os
  2. 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是scala2.11,3.0是scala2.12),正如git repo中所列出的那样。

展开查看全部
rt4zxlrg

rt4zxlrg2#

我在纯scala、jupyter lab和almond上做了以下工作,它们使用菊石、无Spark或任何其他重覆盖层:

  1. interp.load.cp (os.pwd/"yourfile.jar")

上面的内容,直接作为语句添加到笔记本中,加载 yourfile.jar 从当前目录。之后,您可以从jar导入。例如, import yourfile._ ,如果 yourfile 顶级包的名称。我注意到一个警告,在尝试加载之前,应该等待一段时间,直到内核正确启动。如果第一条语句运行太快(例如restart和runall),那么整个语句将挂起。这似乎是一个无关的问题。
当然,您可以构造另一个路径(在这里查找可用的api)。此外,在上面的ammonite magic imports链接下,您将找到如何从ivy加载包或如何加载scala脚本的信息。诀窍是使用 interp 对象和 LoadJar 你可以从中获得的特质。 LoadJar 具有以下api:

  1. trait LoadJar {
  2. /**
  3. * Load a `.jar` file or directory into your JVM classpath
  4. */
  5. def cp(jar: os.Path): Unit
  6. /**
  7. * Load a `.jar` from a URL into your JVM classpath
  8. */
  9. def cp(jar: java.net.URL): Unit
  10. /**
  11. * Load one or more `.jar` files or directories into your JVM classpath
  12. */
  13. def cp(jars: Seq[os.Path]): Unit
  14. /**
  15. * Load a library from its maven/ivy coordinates
  16. */
  17. def ivy(coordinates: Dependency*): Unit
  18. }
展开查看全部

相关问题