0

다음 스파크 코드의 저장 수준을 변경할 수 없습니다는 RDD

은 이미 수준

에게 할당 된 후 RDD의 저장 수준을 변경할 수 없습니다

동일한 예외가 StorageLevel.MEMORY_ONLY으로 발생합니다. 한편

다음 코드는 제대로 작동합니다
val model = ALS.trainImplicit(ratings = ratingsRDD, 
           rank = rank, 
           iterations = numIterations, 
           lambda = lambda, 
           alpha = alpha) 
    val modelSubsetRDD = new MatrixFactorizationModel(
     rank = rank, 
     userFeatures = model.userFeatures, 
     productFeatures = model.productFeatures) 

    model.userFeatures.persist(StorageLevel.MEMORY_ONLY) 
    model.productFeatures.persist(StorageLevel.MEMORY_ONLY) 

이 시간 userFeaturesproductFeatures이 모델의 서로 다른 두 멤버로 설정 것으로 나타났습니다. 그러나 이것이 왜 효과가 있는지는 잘 모르겠습니다.

+0

아직 문제가있는 경우 질문을 업데이트하십시오. 아래 해결 방법으로 문제가 해결되면 승인 된 것으로 표시하십시오. – micker

답변

1

코드의 다른 부분에서 일부 지속성이 떨어질 수 있습니다. ?? 모델을 반환하기 전에 ALS.trainImplicit이 (가) 무엇을하는지 확신하지 못했습니다.

cache()을 호출하면 MEMORY_ONLY에 RDD가 저장되고 persist을 호출하면 캐싱 유형을 변경할 수 있습니다. 그래서 나는이 RDD가 이미 다른 곳에서 유지되어 왔고 문제가있는 cache()으로 다시 저장하려고 시도하고 있다고 생각합니다. 그러나 지속성 유형을 persist으로 변경하는 것은 완벽하게 허용됩니다.

편집 :

다음 코드를 사용해보십시오 :

val model = ALS.trainImplicit(ratings = ratingsRDD, 
           rank = rank, 
           iterations = numIterations, 
           lambda = lambda, 
           alpha = alpha) 
if(model.productFeatures.getStorageLevel() == StorageLevel.NONE) 
    model.productFeatures.cache() 

val modelSubsetRDD = new MatrixFactorizationModel(
    rank = rank, 
    userFeatures = model.productFeatures, 
    productFeatures = model.productFeatures) 

이 이미 (메모리 나 디스크에 하나) 캐시 된 무언가를 캐시하려고하지 않도록해야합니다.

+0

나는 persist와 동일한 예외를 얻는다. 이상하게도 코드의 마지막 부분이 작동합니다. – Bob

+0

MatrixFactorizationModel에서 아무런 처리도하지 않습니까? 기본적으로 블랙 박스 인 두 개의 클래스를 다루기가 정말 어렵습니다. – micker

+0

예, 두 경우 모두 동일한 코드를 사용하고 있습니다. 유일한 차이점은 한 가지 경우에 productFeatures를 두 번 사용한다는 것입니다. – Bob