Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala sbt组件,包括我的jar_Scala_Apache Spark_Sbt - Fatal编程技术网

Scala sbt组件,包括我的jar

Scala sbt组件,包括我的jar,scala,apache-spark,sbt,Scala,Apache Spark,Sbt,我想用我的代码构建一个“胖”罐子。我基本上理解如何做到这一点,但我所有的示例都使用了jar不是本地的想法,我不确定如何在我组装的jar中包含另一个我构建的、scala代码使用的jar。比如,这个JAR必须包含在哪个文件夹中 通常,当我使用spark shell运行当前代码作为测试时,它看起来如下所示: spark-shell --jars magellan_2.11-1.0.6-SNAPSHOT.jar -i st_magellan_abby2.scala (jar文件与.scala文件位于

我想用我的代码构建一个“胖”罐子。我基本上理解如何做到这一点,但我所有的示例都使用了jar不是本地的想法,我不确定如何在我组装的jar中包含另一个我构建的、scala代码使用的jar。比如,这个JAR必须包含在哪个文件夹中

通常,当我使用spark shell运行当前代码作为测试时,它看起来如下所示:

spark-shell --jars magellan_2.11-1.0.6-SNAPSHOT.jar -i st_magellan_abby2.scala 
(jar文件与.scala文件位于同一路径中)

所以现在我想构建一个build.sbt文件,它做同样的事情,并包含SNAPSHOT.jar文件

name := "PSGApp"
version := "1.0"
scalaVersion := "2.11.8"

resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven"

//provided means don't included it is there.  already on cluster?

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "2.2.0" % "provided",
    "org.apache.spark" %% "spark-sql" % "2.2.0" % "provided",
    "org.apache.spark" %% "spark-streaming" % "2.2.0" % "provided",
    //add magellan here somehow?

)
那么,我应该把jar放在SBT项目文件夹结构中的什么位置,以便在运行SBT assembly时提取它呢?它在主/resources文件夹中吗?参考手册上说的“要包含在主jar中的文件”应该放在哪里

我应该在libraryDependencies中放些什么,让它知道如何添加特定的jar,而不是通过互联网获取它

最后一件事,我也在我的测试代码中做了一些导入,现在我把这些代码放在一个附加了
defmain
的对象中,这些代码似乎无法运行

我有过这样的经历:

import sqlContext.implicits.\这在上面的代码中是正确的,它将像这样使用:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.implicits._
import org.apache.spark.sql.functions.udf

val distance =udf {(a: Point, b: Point) => 
   a.withinCircle(b, .001f);  //current radius set to .0001
}

我不确定是否可以将这些导入内容保存在def主管道内?还是我得把它们搬到别的地方去?(我仍在学习scala并争论范围问题)。

一种方法是在本地使用汇编插件()构建胖jar,并
publishLocal
将生成的jar存储到本地ivy2缓存中

这将基于此项目中的build.sbt设置使其可包含在其他项目中,例如:

name := "My Project"
organization := "org.me"
version := "0.1-SNAPSHOT"
将作为
“org.me”%%“我的项目”%%“0.1-SNAPSHOT”本地提供

SBT将在尝试从外部回购下载之前搜索本地缓存

然而,这被认为是不好的做法,因为只有最后的项目应该是一个胖罐子。你不应该把一个列为依赖项(很多麻烦)

若PGapp中包含了这个库,那个么就并没有理由让麦哲伦项目成为一个胖罐子。只是在本地发布,没有汇编

另一种方法是使项目作为代码而不是库相互依赖

lazy val projMagellan = RootProject("../magellan")
lazy val projPSGApp = project.in(file(".")).dependsOn(projMagellan)
这使得projMagellan中的projPSGApp-tigger编译成为可能

但这取决于您的用例

只是不要陷入必须手动管理.jar的情况

另一个问题:

import sqlContext.implicits.\u
应始终包含在需要数据帧操作的范围内,因此不应将该导入放在标题中其他导入的附近


更新

根据评论中的讨论,我的建议是:

  • 得到麦哲伦报告
git克隆git@github.com:harsha2010/magellan.git

  • 创建要处理的分支,例如
git签出-b新东西

  • 更改所需的代码
  • 然后更新版本号,例如
version:=“1.0.7-SNAPSHOT”

  • 本地发布
sbt publishLocal

你会看到(过一会儿):

[信息]将常春藤发布到/Users/tomlous/.ivy2/local/harsha2010/magellan_2.11/1.0.7-SNAPSHOT/ivys/ivy.xml

  • 转到其他项目
  • 更改
    build.sbt
    以包括
“harsha2010”%%“magellan”%%“1.0.7-SNAPSHOT”
在您的
库依赖项中

现在你有一个很好的(临时)参考你的图书馆

您的PSGApp应该构建为一个胖jar程序集,以传递给Spark

sbt清洁组件

这将拉入定制构建jar


如果麦哲伦项目中的更改对世界其他地区有用,您应该推动您的更改并创建一个请求,以便将来您可以只包含此库的最新版本

感谢您的回复。我之所以包括麦哲伦,是因为对项目进行了编辑,并用我们的编辑重新构建了jar。第二,非常感谢你澄清了隐含的观点。当我把这个小小的测试项目打包到一个obj中,用于构建一个jar时,我已经把它移到了标题处。知道它不应该是这种方式,我可以把它移回去。似乎RootProject调用意味着我可以将编辑过的麦哲伦代码“编译”到PSGApp中,我读对了吗?如果是这样的话,我会在构建结构中的什么地方弹出麦哲伦文件夹?不,麦哲伦可以存在于项目文件夹之外(这就是为什么../引用PSGApp根文件夹的build.sbt)也可以是绝对路径。哦,这是有趣的信息,我必须从github获得麦哲伦项目并进行测试构建。谢谢你的信息!我相信要想弄清楚在这里要做什么,我想我也要研究scala中的多项目构建?对于谷歌来说,这似乎是学习如何做到这一点的正确关键词,到目前为止,我还没有完成一个SBT构建,因此是的,在你的麦哲伦项目上使用多项目构建或运行
SBT publishLocal
(确保你使用一个快照或不同的版本号,然后直播),并在你的pgapp SBT中包含该引用,因此,它会找到您本地发布的jar(在ivy2缓存中),因为magellan不是您自己的项目,可能希望将来用正式版本替换它,我实际上会使用它。