此为使用者自己选择释放需要的已经缓存的rdd。
def unpersistUnuse(rddString: Set[String], sc: SparkContext) = {
var persistRdds = sc.getPersistentRDDs
persistRdds.foreach(truple => {
val xx = truple._2.toString()
val ddd = rddString
if (!rddString.contains(truple._2.toString())) {
truple._2.unpersist()
}
})
}
针对多个sp串行跑,其中采用多个sp之间进行重新new sparkcontext和sc.stop进行,否则中间许多缓存问题无法解决,始终会有内存溢出的问题,重新初始化sparkcontext会大概有40s到50s 的时间,针对几百G的数据跑数来说,微乎其微,主要考虑安全性,可以大表初始化一次sparkContext,多个小表初始化一次。多次测试进行优化
采用insert into 表名 (字段,字段1)select 字段,字段1 from 表名,hive支持这种方式的insert into方式,可以解决一些关于表与表之前插入数据时表结构不一致的情况。(一般为增加或减少字段问题)
spark 提交模式中,yarn-client模式和yarn-cluster模式在使用过程有部分差异,其中表现为:yarn-client会显示stage进度,yarn-cluster是不会显示的。程序中如果存在多次sparkContext初始化,中间出现sc.stop,yarn-client会继续初始化,而yarn-cluster不会继续初始化。
count(distinct a)over(partion by c,d)
该函数在hive 1.2中不支持,在hive2.1以后才支持,使用
count(a) over (partion by c,d,a)这种方式来解决。
count(distinct a)这种方式是支持的
找到一个比较好的办法来检验已经替换的sparksql语法,将原先改变之后的语法逻辑,在oracle上做减集 a minus b,b minus a,比较是否出现差集。
parquet如果在多次读写错误数据,有可能是parquet被写坏了,将表删除重新建立,还有一种情况,第一次写,不出错,第二次写parquet出错,报parquet找不到,处理方法,要么使用refresh table,清理下之前的表,要么使用count()触发一下rdd。注意触发一定要在writeparquet前触发
在xml解析中,报表层逻辑复杂步骤多,所以测试时最好将多个临时表落地,才能够将后面的步骤进行测试,否则每次重跑前面多步,使得测试开发效率大大降低。
不支持null这种数据类型,必须使用‘0’等数字代替