2015-01-13 93 views
-1

我有一个Scala/Spark项目(使用Maven构建),我想在其中执行以下操作。从另一个模块访问Scala私有类

我想修改org.apache.spark.mllib.recommendations.ALS,所以我已将该文件的源代码复制到我自己的包中:org.apache.spark.mllib.myrecommendations.ALS。但是,它依赖于org.apache.spark.util.Utils等一些类,它们被声明为private[spark]

我曾希望通过将我的代码放在org.apache.spark之内,它可以访问私有成员。但它是抱怨,也许是因为Spark是通过Maven模块导入的?我该如何解决这个问题?

这里是进口的pom.xml如何火花mllib:

<dependency> 
     <groupId>com.sparkjava</groupId> 
     <artifactId>spark-core</artifactId> 
     <version>2.0.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-mllib_2.10</artifactId> 
     <version>1.1.0</version> 
     <scope>provided</scope> 
    </dependency> 

这里是我碰到一个错误信息的例子:

error: variable checkpointDir in class SparkContext cannot be accessed in org.apache.spark.SparkContext 
[WARNING]   if (sc.checkpointDir.isDefined && (iter % 3 == 0)) { 
[WARNING]    ^

展望org.apache源.spark.SparkContext,我看到checkpointDir被声明为私有org.apache.spark:

private[spark] var checkpointDir: Option[String] = None 

为什么即使我的代码位于org.apache.spark.mllib.myrecommendation.ALS,org.apache.spark的子代中,我也无法访问此成员?

+1

你不应该使用任何类的私有成员!请检查您想要调用/创建的任何方法/类是否具有公共接口。使用私有成员是根本错误。 – bkowalikpl

+2

私人会员是有原因的私人会员。试图击败这是@bkowalikpl说的根本错误。如果您认为这些成员被错误地设为私有,那么请与Spark软件作者一起处理这个问题。 –

+2

你似乎没有理解我的问题。我明白应用程序/客户端代码不应该访问私有成员。但是,我试图修改Spark的* part *类中的一个类的实现。由于该类是Spark本身的一部分,因此它可以访问“spark”包私有的类和方法。我想知道是否可以从一个不同的Maven项目中将新类添加到现有的包中。 – PBJ

回答

0

请不要试图违反任何编程语言中的可见性和可访问性规则。如果你真的需要改变一些东西在火花源代码而不是为,安全的做法是:

  • 克隆的源代码
  • 应用修改
  • 构建和在本地Maven发布库(在工件标识符改变的东西)
  • 更新你的pom.xml指已创建

星火测试新版本被作为构建的一部分执行的,并希望如果你的修改引入了错误,你会发现它,因为测试失败。

+3

只是使用内部API,OP不违反可见性。访问规则有助于管理这样做的风险。 –

2

它适合我。

由于软件包已打开,因此以您描述的方式添加到它们中是完全正常的(从密封的jar文件进行模加载)。

ALS.scala的一个简单的sbt项目修改为驻留在包recommendation2(并修复了几个private[recommendation2])并导入org.apache.spark.mllib.recommendation.MatrixFactorizationModel

build.sbt:

scalaVersion := "2.10.3" 

scalacOptions ++= Seq("-Xlint", "-deprecation") 

libraryDependencies ++= Seq(
    "org.apache.spark" % "spark-core_2.10" % "1.2.0", 
    "org.apache.spark" % "spark-mllib_2.10" % "1.2.0", 
    "junit" % "junit" % "4.12" % "test" 
) 

然后

$ sbt compile 
[info] Set current project to SparkHack (in build file:/home/apm/tmp/spark-hack/) 
[info] Updating {file:/home/apm/tmp/spark-hack/}spark-hack... 
[info] Resolving [snip]... 
[info] Done updating. 
[info] Compiling 1 Scala source to /home/apm/tmp/spark-hack/target/scala-2.10/classes... 
[success] Total time: 22 s, completed Jan 19, 2015 9:10:03 AM 
相关问题