직렬화 문제없이 GraphFrames에 의존하는 새 스칼라 클래스 만들기

Michal

Spark의 GraphFrames를 기반으로하는 스칼라 클래스를 작성하려고합니다. GraphFrame 클래스는 여기에서 정의 됩니다 . GraphFrames 클래스는 직렬화 가능을 확장합니다. GraphFrames를 확장하고 추가 그래프 속성을 계산하는 클래스를 작성하고 싶습니다. 이 예제를 단순화하기 위해 함수를 포함하지 않는 클래스를 만들었습니다. 그것이하는 일은 단지 GraphFrames를 확장하는 것입니다.

import org.apache.spark.sql.DataFrame
import org.graphframes._

class NewGraphFrame(@transient private val _vertices: DataFrame,
                    @transient private val _edges: DataFrame) extends GraphFrame {

}

val vertices = Seq(
  (1, "John"),
  (2, "Jane"),
  (3, "Karen")
).toDF("id", "name")

val edges = Seq(
  (1, 3),
  (2, 3),
  (2, 1)
).toDF("src", "dst")

val g = new NewGraphFrame(vertices, edges)

REPL에서이 코드를 실행하면 다음 오류가 발생합니다.

java.lang.Exception: You cannot use GraphFrame objects within a Spark closure
  at org.graphframes.GraphFrame.vertices(GraphFrame.scala:125)
  at org.graphframes.GraphFrame.toString(GraphFrame.scala:55)
  at scala.runtime.ScalaRunTime$.scala$runtime$ScalaRunTime$$inner$1(ScalaRunTime.scala:332)
  at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala:337)
  at scala.runtime.ScalaRunTime$.replStringOf(ScalaRunTime.scala:345)
  at .$print$lzycompute(<console>:10)
  at .$print(<console>:6)
  at $print(<console>)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:786)
  at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1047)
  at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
  at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
  at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
  at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
  at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
  at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:569)
  at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:565)
  at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:807)
  at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:681)
  at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:395)
  at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:415)
  at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:923)
  at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
  at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
  at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97)
  at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:909)
  at org.apache.spark.repl.Main$.doMain(Main.scala:76)
  at org.apache.spark.repl.Main$.main(Main.scala:56)
  at org.apache.spark.repl.Main.main(Main.scala)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
  at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)
  at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
  at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
  at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
  at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

나는 이것이 내가 두 번 직렬화한다는 것을 의미한다는 것을 알고 있습니다. 그러나 나는 분명히 그것에 관심이 없습니다. 클래스에서 그래프 기능을 사용할 수 있도록이 클래스를 확장하고 싶습니다. 이 오류를 발생시키는 spark repl없이이 클래스를 확장하려면 어떻게해야합니까?

레비 램지

흥미롭게도 직렬화가 발생하지 않았으므로 이것은 실제로 직렬화 문제가 아닙니다.

정의는 다음과 같이 GraphFrame요약됩니다.

class GraphFrame private(private val _vertices: DataFrame, private val _edges) extends Logging with Serializable

첫 번째 private는 기본 생성자가 내부 GraphFrame또는 동반 객체 에서만 액세스 할 수 있음을 의미 합니다. _verticesand _edges는 비공개 이므로 하위 클래스에서 액세스 할 수 없으며 재정의 할 수 없습니다 (사용자 _vertices_edges필드는 GraphFrame접두사로 사용할 수없는 : 의 해당 이름 필드와 다릅니다 override.

GraphFrame 단일 공개 인수가없는 생성자를 정의합니다.

def this() = this(null, null)

GraphFrame따라서 의 모든 하위 클래스 nullfor GraphFrame._vertices또는 을 가지며 GraphFrame._edges, 이는 GraphFrame. 접근 자 verticesedges확인 null하고 던집니다. 이러한 접근자는 toString메서드 에서 호출되기 때문에 .NET Framework를 만들 때 REPL이 폭발하는 이유 NewGraphFrame입니다. GraphFrame그것들이 null있다면 그것은 직렬화가 시도되었음을 의미 한다고 가정하는 것 같습니다 .

REPL에서 다음과 같이 설명 할 수 있습니다.

new NewGraphFrame(vertices, edges).vertices

결과는 null.

검색하는 메서드로 메서드 를 재정의하면 vertices( 및에 대해 동일한 작업을 수행 ) 최소한 새 클래스 를 사용할 수 있습니다 ._NewNewGraphFrame._verticesedgestoString

override def vertices: DataFrame = _vertices
override def edges: DataFrame = _edges

의 방법 정도로 GraphFrame당신이 사용에 관심이 vertices/ edges대신 _vertices/ _edges당신은 기존의 방법을 활용할 수 있습니다 GraphFrame.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

스칼라에서 직렬화 할 수없는 작업

분류에서Dev

Celery에서 사용하기 위해 json 직렬화를 지원하는 클래스 만들기

분류에서Dev

정적 클래스 내에서 '인터페이스 표현 클래스'의 새 개체 만들기

분류에서Dev

Java Swing에서 버튼을 클릭하면 새 이름으로 클래스의 새 객체 만들기

분류에서Dev

클래스 직렬화에서 기본 클래스 영역 제외

분류에서Dev

기존 클래스의 속성으로 새 클래스를 만들 때 파이썬은 어떻게 속성을 인스턴스화합니까?

분류에서Dev

shapeless를 사용하여 스칼라에서 매개 변수화 된 클래스의 이름 가져 오기

분류에서Dev

동일한 이름으로 기존 클래스를 하위 클래스로 만드는 새 클래스 만들기

분류에서Dev

새 하위 클래스 개체를 만들 때 부모 클래스에 정의 된 변수 설정 문제

분류에서Dev

Java는 이전 클래스의 모든 메소드를 계속 노출하면서 새 클래스로 기존 클래스에 기능을 추가합니다.

분류에서Dev

하위 클래스의 "새"속성으로 Json 역 직렬화

분류에서Dev

클래스에 따라 요소 이름이있는 C # XML 직렬화 목록

분류에서Dev

새 변수를 만들지 않고 다른 파일에있는 클래스의 인스턴스 만들기

분류에서Dev

다중 인터페이스 확장 또는 Typescript에서 새 클래스 만들기 (다형성)

분류에서Dev

스칼라. 클래스를 제네릭으로 만들기

분류에서Dev

하나의 라이너에서 여러 개의 새 인스턴스 만들기

분류에서Dev

스칼라 케이스 클래스에서 빼기 기호를 이스케이프하는 방법

분류에서Dev

매개 변수에 따라 파생 클래스의 새 인스턴스 만들기

분류에서Dev

소스 파일을 편집하지 않고 라이브러리 (Eigen)의 클래스에 대한 새로운 기능을 만들 수 있습니까? (C ++)

분류에서Dev

C #의 파생 클래스 개체에서 새 기본 클래스 개체 만들기

분류에서Dev

클래스에서 새 개체를 만드는 문제

분류에서Dev

파일을 새 프로젝트에 복사하고 이제 연결 URL 'null'에 대해 클래스 ''의 JDBC 드라이버를 만들 수 없습니다.

분류에서Dev

스칼라 이상한 클래스 / 객체 초기화

분류에서Dev

역 직렬화 : 사용자 정의 클래스에서 데이터 가져 오기

분류에서Dev

TypeScript : 클래스의 새 인스턴스 만들기

분류에서Dev

typescript의 새 클래스에서 메서드 내 메서드 만들기

분류에서Dev

하위 클래스 문제로 역 직렬화

분류에서Dev

AngularJS : ng-repeat의 항목에 직렬화 된 클래스 제공

분류에서Dev

기존 항목을 덮어 쓰지 않고 배열 내부에 새 클래스 인스턴스 만들기

Related 관련 기사

  1. 1

    스칼라에서 직렬화 할 수없는 작업

  2. 2

    Celery에서 사용하기 위해 json 직렬화를 지원하는 클래스 만들기

  3. 3

    정적 클래스 내에서 '인터페이스 표현 클래스'의 새 개체 만들기

  4. 4

    Java Swing에서 버튼을 클릭하면 새 이름으로 클래스의 새 객체 만들기

  5. 5

    클래스 직렬화에서 기본 클래스 영역 제외

  6. 6

    기존 클래스의 속성으로 새 클래스를 만들 때 파이썬은 어떻게 속성을 인스턴스화합니까?

  7. 7

    shapeless를 사용하여 스칼라에서 매개 변수화 된 클래스의 이름 가져 오기

  8. 8

    동일한 이름으로 기존 클래스를 하위 클래스로 만드는 새 클래스 만들기

  9. 9

    새 하위 클래스 개체를 만들 때 부모 클래스에 정의 된 변수 설정 문제

  10. 10

    Java는 이전 클래스의 모든 메소드를 계속 노출하면서 새 클래스로 기존 클래스에 기능을 추가합니다.

  11. 11

    하위 클래스의 "새"속성으로 Json 역 직렬화

  12. 12

    클래스에 따라 요소 이름이있는 C # XML 직렬화 목록

  13. 13

    새 변수를 만들지 않고 다른 파일에있는 클래스의 인스턴스 만들기

  14. 14

    다중 인터페이스 확장 또는 Typescript에서 새 클래스 만들기 (다형성)

  15. 15

    스칼라. 클래스를 제네릭으로 만들기

  16. 16

    하나의 라이너에서 여러 개의 새 인스턴스 만들기

  17. 17

    스칼라 케이스 클래스에서 빼기 기호를 이스케이프하는 방법

  18. 18

    매개 변수에 따라 파생 클래스의 새 인스턴스 만들기

  19. 19

    소스 파일을 편집하지 않고 라이브러리 (Eigen)의 클래스에 대한 새로운 기능을 만들 수 있습니까? (C ++)

  20. 20

    C #의 파생 클래스 개체에서 새 기본 클래스 개체 만들기

  21. 21

    클래스에서 새 개체를 만드는 문제

  22. 22

    파일을 새 프로젝트에 복사하고 이제 연결 URL 'null'에 대해 클래스 ''의 JDBC 드라이버를 만들 수 없습니다.

  23. 23

    스칼라 이상한 클래스 / 객체 초기화

  24. 24

    역 직렬화 : 사용자 정의 클래스에서 데이터 가져 오기

  25. 25

    TypeScript : 클래스의 새 인스턴스 만들기

  26. 26

    typescript의 새 클래스에서 메서드 내 메서드 만들기

  27. 27

    하위 클래스 문제로 역 직렬화

  28. 28

    AngularJS : ng-repeat의 항목에 직렬화 된 클래스 제공

  29. 29

    기존 항목을 덮어 쓰지 않고 배열 내부에 새 클래스 인스턴스 만들기

뜨겁다태그

보관