2015-01-13 91 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 
相關問題