2015-01-13 3 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. Поскольку этот класс является частью самого Spark, имеет смысл получить доступ к классам и методам, которые являются частными для пакета «искры». Я хотел бы знать, можно ли добавлять новые классы в существующий пакет из другого проекта Maven. – PBJ

ответ

0

Пожалуйста, не пытайтесь нарушать правила видимости и доступности на любом языке программирования. Если вам действительно нужно что-то изменить в Спарк исходном коде, где он не был разработан для, безопасный подход заключается в следующем:

  • клон исходный код
  • применить изменения
  • сборки и публикации в местной Maven репозиторий (изменение что-то в идентификаторе артефакта)
  • обновление ваш pom.xml обратиться к новой версии вы создали

Свечи тесты выполнены как часть сборки, и мы надеемся если ваши изменения вносят ошибки, вы обнаружите это, потому что тест завершился неудачно.

+3

OP не нарушает видимость, просто использует внутренний API. Правила доступа помогают справиться с риском этого. –

2

Это работает для меня.

Поскольку пакеты открыты, добавление к ним в том виде, в котором вы описываете, прекрасно (по модулю загрузка из запечатанных файлов jar).

Тривиального SBT проект с ALS.scala изменен, чтобы находиться в пакете 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 
Смежные вопросы