복붙노트

[SCALA] 작업 직렬화 할 수없는 오류 : 스칼라 불꽃

SCALA

작업 직렬화 할 수없는 오류 : 스칼라 불꽃

나는 스칼라 플러그인과 스파크 라이브러리 인 IntelliJ 커뮤니티 에디션을 사용하고 있습니다. 나는 아직도 스파크를 배우고 및 스칼라 워크 시트를 사용하고 있습니다.

나는 문자열에 문장 부호를 제거하는 아래의 코드를 작성했습니다 :

def removePunctuation(text: String): String = {
  val punctPattern = "[^a-zA-Z0-9\\s]".r
  punctPattern.replaceAllIn(text, "").toLowerCase
}

그럼 텍스트 파일을 읽고 문장 부호를 제거하려고 :

val myfile = sc.textFile("/home/ubuntu/data.txt",4).map(removePunctuation)

어떤 도움을 주시면 감사하겠습니다 다음과 같이이 오류를 제공합니다 :

해결법

  1. ==============================

    1.@TGaweda에서 알 수 있듯이, 스파크의 SerializationDebugger는 식별에 매우 도움이된다 "문제가있는 객체에 지정된 객체에서 최고의 직렬화 경로를." 스택 추적에서 "직렬화 스택"전에 모든 달러 기호는 방법에 대한 컨테이너 개체가 문제가 있음을 나타냅니다.

    @TGaweda에서 알 수 있듯이, 스파크의 SerializationDebugger는 식별에 매우 도움이된다 "문제가있는 객체에 지정된 객체에서 최고의 직렬화 경로를." 스택 추적에서 "직렬화 스택"전에 모든 달러 기호는 방법에 대한 컨테이너 개체가 문제가 있음을 나타냅니다.

    그냥 컨테이너 클래스에 직렬화를 때리고 가장 쉬운 방법이지만, 나는 스칼라는 기능적인 언어를 사실을 활용하고 일류 시민으로 함수를 사용하는 것을 선호합니다 :

    sc.textFile("/home/ubuntu/data.txt",4).map { text =>
      val punctPattern = "[^a-zA-Z0-9\\s]".r
      punctPattern.replaceAllIn(text, "").toLowerCase
    }
    

    당신이 정말로 일을 유지하려는 경우 또는 분리 :

    val removePunctuation: String => String = (text: String) => {
      val punctPattern = "[^a-zA-Z0-9\\s]".r
      punctPattern.replaceAllIn(text, "").toLowerCase
    }
    sc.textFile("/home/ubuntu/data.txt",4).map(removePunctuation)
    

    정규식 당신이 확인해야합니다으로 직렬화하기 때문에이 옵션은 물론 작동합니다.

    아마도 방송과 함께 - 성능을 위해서 귀하의 변환의 요인 그것을 있도록 보조하지만 매우 중요한 메모에서 정규식을 구성하는 것은 비싸다.

  2. ==============================

    2.T. Gaweda 이미 지적한 바와 같이, 당신은 가장 가능성 직렬화 아니다 클래스에 함수를 정의하고 있습니다. 그것은 순수한 기능이기 때문에, 즉 그것을 둘러싸는 클래스의 컨텍스트에 의존하지 않는, 당신이 직렬화를 확장해야 동반자 객체에 넣어 좋습니다. 이것은 자바 정적 방법의 스칼라의 상응하는 것입니다 :

    T. Gaweda 이미 지적한 바와 같이, 당신은 가장 가능성 직렬화 아니다 클래스에 함수를 정의하고 있습니다. 그것은 순수한 기능이기 때문에, 즉 그것을 둘러싸는 클래스의 컨텍스트에 의존하지 않는, 당신이 직렬화를 확장해야 동반자 객체에 넣어 좋습니다. 이것은 자바 정적 방법의 스칼라의 상응하는 것입니다 :

    object Helper extends Serializable {
      def removePunctuation(text: String): String = {
        val punctPattern = "[^a-zA-Z0-9\\s]".r
        punctPattern.replaceAllIn(text, "").toLowerCase
      }
    }
    
  3. ==============================

    3.스택 트레이스를 읽고있다 :

    스택 트레이스를 읽고있다 :

    그것은 매우 좋은 힌트입니다. 귀하의 람다는 직렬화 가능하지만 클래스는 직렬화하지 않습니다.

    당신은 람다 식을 만들 때,이 표현은 외부 클래스에 대한 참조를 가지고있다. 귀하의 경우 외부 클래스, 즉 직렬화되지는 또는 필드 중 하나가 직렬화의 인스턴스가 아닌 직렬화를 구현하지 않습니다

  4. from https://stackoverflow.com/questions/43592742/spark-scala-task-not-serializable-error by cc-by-sa and MIT license