我正在一个相当大的RDD org.apache.spark.mllib.recommendation.ALS
上训练rdd
模型。我想选择一个体面的正则化超参数,以便我的模型不会过度(或不足)。为此,我将rdd
(使用randomSplit
)拆分为火车集和测试集,并使用一组已定义的超参数进行交叉验证。
由于我在交叉验证中多次使用火车并测试RDD,因此在某些时候cache()
数据似乎很自然,以便加快计算速度。但是,我的Spark知识非常有限,我想知道这两个选项中哪一个更好(以及为什么):
在拆分之前缓存初始RDD rdd
,即:
val train_proportion = 0.75
val seed = 42
rdd.cache()
val split = rdd.randomSplit(Array(train_proportion, 1 - train_proportion), seed)
val train_set = split(0)
val test_set = split(1)
在拆分初始RDD后缓存train
和test
RDD:
val train_proportion = 0.75
val seed = 42
val split = rdd.randomSplit(Array(train_proportion, 1 - train_proportion), seed)
val train_set = split(0).cache()
val test_set = split(1).cache()
我的推测是选项1更好,因为randomSplit
也会受益于rdd
被缓存的事实,但我不确定它是否会对(多个)产生负面影响关于选项2,将来访问train_set
和test_set
。
This answer似乎证实了我的直觉,但没有得到任何反馈,所以我想通过在这里询问来确定。
请注意我已在Spark群集上运行实验,但这些天它经常很忙,所以我的结论可能是错误的。我还检查了Spark文档,但没有找到我的问题的答案。
答案 0 :(得分:0)
如果在拆分之前对RDD进行计算,那么最好先将其缓存,因为(根据我的经验),所有转换只运行一次并由缓存触发( )行动
我想split()cache()cache()是3个动作vs cache()split()2。 编辑:缓存不是动作。
事实上,我在其他similar questions around the web中找到了确认
编辑:澄清我的第一句话:DAG将对RDD执行所有转换,然后对其进行缓存,因此之后所做的所有事情都不需要再计算,尽管将再次计算分割部分。
总之,如果您在分割部分上操作比原始RDD本身更重的变换,您可能希望缓存它们。 (我希望有人能支持我)