架构智慧
架构智慧
大数据主流架构经验交流分享
  1. 首页
  2. 离线计算
  3. 正文

spark遇到的空指针问题

2020年07月16日 658点热度 0人点赞 0条评论

最近在使用spark开发的过程中,遇到了一个空指针错误,spark处理数据的过程主要是 spark读取数据库数据做清洗转换,然后需要把数据和数据库中另一个表做匹配查询,查询到结果后存到hdfs.

因为数据量比较大,所以读出数据后,使用了foreachpartition在每个分区做处理优化,打算在分区中匹配数据后转换为dataframe,直接保存到hive,结果调试的过程中遇到了空指针错误,主要代码如下

 var propdb = new java.util.Properties
 val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
 val df = sqlContext.read.jdbc("jdbc:url", "demo", propdb )  
 df.foreachpartition(partition => {
     val gpsArr = new Arraybuffer(Gps)
     partition.foreach(data => {
        gpsArr.append(data)
		})
gpsList.toList.toDF("id","name")
})

结果运行调试的时候报告错误

google搜索了一下问题,找到答案

空指针异常的原因是因为dataframe,rdd或dataset只能存在于driver上,不能在worker节点创建

解决方法: 写入hdfs文件的话,可以使用stream流方式逐行写入

var propdb = new java.util.Properties
 val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
 val df = sqlContext.read.jdbc("jdbc:url", "demo", propdb )  

 val path = new Path(hdfsPath + System.currentTimeMillis())
// 创建一个HDFS outputStream流
val outputStream = if (fs.exists(path)){
  fs.append(path)
}else{
  fs.create(path)
}

 df.foreachpartition(partition => {
     partition.foreach(message => outputStream.write((message + "\n").getBytes("UTF-8")))
		})
	outputStream.close()	
})

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: dataframe spark
最后更新:2020年07月19日

hivefans

保持饥渴的专注,追求最佳的品质

点赞
下一篇 >

文章评论

取消回复
分类目录
  • 大数据浪潮 (2)
  • 实时数仓 (1)
  • 实时计算 (6)
  • 离线计算 (4)
2020年7月
一 二 三 四 五 六 日
 12345
6789101112
13141516171819
20212223242526
2728293031  
« 6月   8月 »
文章归档
  • 2021年7月 (2)
  • 2020年9月 (4)
  • 2020年8月 (4)
  • 2020年7月 (2)
  • 2020年6月 (1)
标签聚合
窗口函数 hive spark elasticsearch flink dataframe 实时计算 kafka
友情链接
  • 大数据导航
  • 网站地图
  • 隐私政策

COPYRIGHT © 2020 架构智慧. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

京ICP备19056408号