以下Spark代码:
val model = ALS.trainImplicit(ratings = ratingsRDD,
rank = rank,
iterations = numIterations,
lambda = lambda,
alpha = alpha)
model.productFeatures.cache()
val modelSubsetRDD = new MatrixFactorizationModel(
rank = rank,
userFeatures = model.productFeatures,
productFeatures = model.productFeatures)
提出以下例外:
在分配了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)
注意到此时userFeatures
和productFeatures
设置为两个不同的模型成员。但是,我不确定为什么会这样。
答案 0 :(得分:1)
您可能会从代码中的其他位置获得一些持久性?在返回模型之前,不确定ALS.trainImplicit
正在做什么。
调用cache()
会将RDD存储在MEMORY_ONLY中,而调用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)
这应避免您尝试缓存已缓存的内容(在内存或磁盘中)。