Spark1.x升级Spark2.x常见异常【map】
一.创建Spark入口
相较于Spark1.x,Spark2.x最明显的区别就是程序执行入口的区别了,从SparkContext变为SparkSession。相较于SparkContext,SparkSession对SparkContext进行了二次封装,把原有Spark1.x中的SQLContext和HiveContext进行了合并,默认为SQLContext,当需要访问Hive时,只需开启对Hive的支持即可【.enableHiveSupport(),当然hive的相关配置还是要设置的】,如下:
val spark = SparkSession.builder.appName(s"${this.getClass.getSimpleName}").master("local[2]").getOrCreate()
二.创建DataFrame数据集
在Spark2.x中,获取数据集的方式和Spark1.x非常类似,只需从结构化数据源直接加载或从非结构化数据源转换即可,如下:
// 数据集直接的转换import spark.implicits._val technology = spark.sparkContext.textFile("D:\\software\\spark-2.4.4\\data\\sql\\dataframe.txt").map(_.split(",")).map(row => Technology(row(0), row(1).toLong, row(2).toLong)).toDF()technology.show()
执行效果如下:
备注:import spark.implicits._是为了可以直接使用toDF()算子,否则会直接报错。
三.常见异常之map
下面要说到重点的地方了,在Spark升级到2版本后,map异常是非常常见的,究其原因其实就是:在Spark1.x中使用map之类的算子会把dataframe转换为rdd,而在Spark2.x中会转换为dataset。相较于rdd,dataset最大的区别就在于Encoder了。
对于scala的使用者而言,scala代码中嵌入部分java数据类型是非常常见的,这部分java数据类型就是报错的主要来源!下面使用代码验证具体哪些情况会导致异常:
1.直接使用map
technology.map(row => row.getAs[String]("name")).show()
执行结果:
从执行结果可知,直接使用map是不会报错的,因此map不是报错的原因。
2.使用Row
technology.map(row => Row(row.getAs[String]("name"))).show()
执行结果直接报错,如下:
Error:(34, 19) Unable to find encoder for type org.apache.spark.sql.Row. An implicit Encoder[org.apache.spark.sql.Row] is needed to store org.apache.spark.sql.Row instances in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.technology.map(row => Row(row.getAs[String]("name"))).show()^
根据执行结果可知,报错原因是Row没有encoder导致的,即使Row本身就来自spark内部:
3.使用toMap和在map内部使用java的Calendar
technology.map(row => {val cal = Calendar.getInstance()val format = new SimpleDateFormat("yyyy-MM-dd")val date = format.format(cal.getTime).replace("-", "")(row.getAs[String]("name"), date)}).collect().toMap[String, String].foreach(println)
执行结果:
根据执行结果可知,不管是在map内部使用java基本类型,还是在外部使用toMap都不会报错!
因此,可以看出,报错不在乎使用的java还是scala数据类型,而在于是否可以encoder。
四.解决方案
常用的解决方面有两种:
1.对没有encoder的数据类型指定encoder。如下
implicit val mapEncoder = org.apache.spark.sql.Encoders.kryo[Row]technology.map(row => Row(row.getAs[String]("name"))).show()
单独指定Row类型的encoder。
执行结果如下:
2.把dataframe转换为rdd【按照1.x版本操作】
technology.rdd.map(row => Row(row.getAs[String]("name"))).foreach(println)
执行结果:
五.备注
不同人在代码中使用到的数据类型是多种多样的,要使用第一种方案,只需要把[Row]中的Row换成自己使用的类型即可;若使用第二种方案可以不用考虑这些,但这样会破坏Spark2.x的使用风格【相当于Spark2.x中穿插有Spark1.x】!
Spark1.x升级Spark2.x常见异常【map】相关推荐
- salesforce 零基础学习(五十四)常见异常友好消息提示
异常或者error code汇总:https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_con ...
- Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改
java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理. ...
- Spark ALS recommendForAll源码解析实战之Spark1.x vs Spark2.x
文章目录 Spark ALS recommendForAll源码解析实战 1. 软件版本: 2. 本文要解决的问题 3. 源码分析实战 3.1 Spark2.2.2 ALS recommendForA ...
- selenium 学习、工作 记录,附常见异常和工具方法
selenium 学习.工作 记录,附常见异常和工具方法 基础配置 2020.03.31 开发者模式 设置有认证的http代理 让selenium接管人为打开的chrome 2020.07.23(79 ...
- Flink常见异常和错误信息小结
大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! Flink的常见异常众多,不可能面面俱到,所以想到哪儿写到哪儿,有漏掉的之后再补充. 部署和资源问题 ...
- 绝地求生服务器维护错误,哪些是绝地求生常见异常解决方案?
现在一款黑马游戏当属绝地求生,对于绝地求生常见异常问题,腾讯电脑管家官网也整理出一套方案,具体是什么方案?能够解决绝地求生常见异常吗?接下来和小编一起来看看吧. 主要症状 绝地求生玩不了,出现各种错误 ...
- Android 常见异常及解决办法
Ø 前言 本文主要记录 Android 的常见异常及解决办法,以备以后遇到相同问题时可以快速解决. 1. java.lang.NullPointerException: Attempt to i ...
- 初学Python常见异常错误,总有一处你会遇到!
初学Python常见异常错误,总有一处你会遇到! 参考文章: (1)初学Python常见异常错误,总有一处你会遇到! (2)https://www.cnblogs.com/xxpythonxx/p/1 ...
- Cloudera Manager 常见异常
Cloudera Manager 常见异常 参考文章: (1)Cloudera Manager 常见异常 (2)https://www.cnblogs.com/lemonu/p/10332962.ht ...
最新文章
- 十年磨一剑,可重构计算架构将引领未来芯片市场
- iOS私有Api检测
- 自己写分布式配置中心(上篇)- 单机模式
- 个人分析美国电脑销售现状(网店)
- Redis分布式锁,看完不懂你打我
- mysql set 常用参数_mysql常见配置参数
- 解决spring和struts配合问题
- 公司消费一卡通“变法”记
- android studio syso快捷键,AndroidStudio代码段简写Live Template
- luogu1082 [NOIp2012]同余方程 (扩展欧几里得)
- mysql 数据舍取_mysql取舍索引
- SAP License:跨行如何转入SAP
- Postman安装与简单使用
- 微信小程序 转发 分享功能
- 点击reset按钮失效 input 和 button元素 作为提交、重置、按钮功用的区别
- 解决最新小马激活工具导致主页劫持问题
- 说说你对keep-alive的理解是什么?
- linux speedtest-cli测速报错
- 求1~n中0~9出现的次数
- A001 - 基础 - 交换机原理简述
热门文章
- matlab降噪报告,基于matlab主动降噪实验.docx
- TL-WR740N_V4板TTL刷机指南_TFTP
- 国家自然科学基金 计算机视觉,我院教师焦红伟获批2018年国家自然科学基金面上项目...
- 中基鸿业分析投资应该注意的事项
- java中protect是什么_Java中public、private、protecte、default、public void是什么意思 | 学步园...
- win7怎么连接不上宽带连接服务器未响应,宽带连接不上,教您怎么解决宽带连接不上...
- 对话驴评网CEO崔继蓉:在线旅游的前途在移动端
- 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
- SSM实现养老院管理系统
- unity 3d游戏开发_使用Unity 5开发3D游戏