spark的rdd与其他dataSet都可以做持久化,关于持久化的等级也可根据自身需求选择关于持久化等级可查看官网
http://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence
这里记录一次关于持久化的直观感受;
在项目中需要对一批数据做三次校验,1.通用校验,2.字段名称合法性校验,3.字段值得类型校验。由于需要对通过每一次校验的结果做统计来写报告所以伪代码如下:
val rdd1 = rdd.filter(通用校验)
//统计数量
county1 = rdd1.count()
val rdd2 = rdd1.filter(名称合法性校验)
//统计合法数量
county2 = rdd2.count()
val rdd3 = rdd2.filter(类型校验)
//统计类型校验通过的数量
county3 = rdd3.count()
//每种校验都打印当前校验的名称
当测试代码的时候发现:当开始最后一步类型校验的时候会把前两种校验也给打印出来,这说明在最后一步校验时使用的额rdd2是通过有最初的rdd重新计算得到的,这就很可怕了,我不能为了你个统计数字重复这么大量的工作啊。所以想到了持久化的问题将代码做如下处理:
val rdd1 = rdd.filter(通用校验)
//统计数量
county1 = rdd1.count()
val rdd2 = rdd1.filter(名称合法性校验)
//统计合法数量
county2 = rdd2.count()
//*****************************持久化********************************//
rdd2.persist(StorageLevel.MEMORY_ONLY)
val rdd3 = rdd2.filter(类型校验)
//统计类型校验通过的数量
county3 = rdd3.count()
//每种校验都打印当前校验的名称
然后再观察日志就会看到最后一步只打印value类型校验的日志。但是这种方法有一个问题就是持久化需要内存或者磁盘,前者性能较好,但是安全性和资源占用比较严重,后者磁盘IO严重,当然这不在今天的讨论范围之内,针对我的这个需求有更好的解决方案。
最后附两张日志图片