第一个问题,无论如何,在应用任何reduce函数之前,我是否可以急切地加载RDD?如果不是,我将不得不做虚拟减少功能,因为我试图在我的休息应用程序启动期间缓存RDD!
其次,即使在运行reduce函数后,我也看不到任何缓存。我正在使用spark和spark sql。我正在使用sparkcontext读取hdfs目录(part-r- *)。我在调用registerAsTable之后尝试在生成的JavaSchemaRDD上调用cahce()。但是如果我在加载JavaRDD之后尝试调用cache(),那么缓存似乎可行。在JavaRDD上调用cache()而不是JavaSchemaRDD有什么区别?
答案 0 :(得分:1)
cache()
或persist()
函数进行缓存,它也只会在计算时缓存,并且根据惰性计算模型,计算本身仅在action
将被执行时执行执行。您可能想要使用的最简单的操作是缓存整个RDD count()
cache()
没有区别,只有在调用cache()
或persist()
之后在该RDD之上执行操作后才会缓存它。正如我上面所说,填充缓存的最简单的操作是count()
,因为它将遍历所有RDD并缓存所有分区(如果你有足够的内存)。像take()
这样的东西只会缓存一些分区,reduce()
会导致额外的计算,而这些计算在你的情况下是不需要的。如果它没有回答您的问题,请提供代码示例
答案 1 :(得分:0)
//在启动期间
JavaSchemaRDD schemaRDD0 = sqlContext.applySchema(ObjAJavaRdd, ObjA.class);
schemaRDD0.registerAsTable(“tablename”);
schemaRDD0.cache()
//在每个请求期间;每次调用有几个查询请求,每次火花从文件加载RDD而不是第一次缓存它
JavaSchemaRDD schemaRDD1 = sqlContext.sql(queryString);
JavaPairRDD<String, double[]> pairRDD = schemaRDD1.mapToPair(row -> transform(row));
JavaPairRDD<String, double[]> pairReducedRDD = pairRDD.reduceByKey((a,b) -> reduceterms(a, b));
如果我在启动期间执行了操作,则按预期缓存
ObjAJavaRdd.cache()
JavaSchemaRDD schemaRDD0 = sqlContext.applySchema(ObjAJavaRdd, ObjA.class);
schemaRDD0.registerAsTable(“tablename”);