内容简介:Spark踩坑之App闭包Null Pointer问题
昨天踩了 App子类闭包问题 ,刚开始用Spark 2.1的DataSet相关API,误以为是使用的姿势不正确,定位问题的方向不对,浪费了好多时间调试。后来改回成DataFrame API,问题得到了快速定位。因为这个bug在DataSet闭包中,使用broadcast的value不会报错,程序可以顺利执行;而在DataFrame闭包中,调用broadcast的value,会抛出null pointer异常。
看看下面的例子,
object DemoBug extends App { val conf = new SparkConf() val sc = new SparkContext(conf) val rdd = sc.parallelize(List("A","B","C","D")) val str1 = "A" val rslt1 = rdd.filter(x => { x != "A" }).count val rslt2 = rdd.filter(x => { str1 != null && x != "A" }).count println("DemoBug: rslt1 = " + rslt1 + " rslt2 = " + rslt2) }
输出内容
DemoBug: rslt1 = 3 rslt2 = 0
根据输出,说明变量 str1 并没有正确的传到 rdd 的闭包filter中。如果将App换成main,可以得到期望的结果。
object DemoBug { def main(args:Array[String]) = { val conf = new SparkConf() val sc = new SparkContext(conf) val rdd = sc.parallelize(List("A","B","C","D")) val str1 = "A" val rslt1 = rdd.filter(x => { x != "A" }).count val rslt2 = rdd.filter(x => { str1 != null && x != "A" }).count println("DemoBug: rslt1 = " + rslt1 + " rslt2 = " + rslt2) } }
输出内容
DemoBug: rslt1 = 3 rslt2 = 3
根据 spark官方bug 反馈,此问题已经解决了,但是实际来看还是没有解决。所以还是乖乖使用main吧!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- go语言闭包问题
- JavaScript循环出现的问题——用闭包来解决
- 草根学Python(十五) 闭包(解决一个需求了解闭包流程)
- [原]谈一谈闭包
- Java闭包如何工作
- 理解 JavaScript 闭包
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
互联网+供应链金融创新
宝象金融研究院、零壹研究院 / 电子工业出版社 / 2016-6 / 65.00
供应链金融是一种带有模式创新的金融服务,它真正渗透到了产业运行的全过程。然而,如何探索这种模式的规律?特别是在"互联网+”时代,不同的产业主体如何更好地利用供应链金融促进产业的发展,成为了众多企业关注的话题。零壹财经攥写的《互联网+供应链金融创新》正是立足于这一点,全面总结反映了中国各行各业,以及不同的经营主体如何在立足产业运营的基础上,通过供应链金融来促进产业的发展具有很好的借鉴意义,其丰富的案......一起来看看 《互联网+供应链金融创新》 这本书的介绍吧!