一.创建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】相关推荐

  1. salesforce 零基础学习(五十四)常见异常友好消息提示

    异常或者error code汇总:https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_con ...

  2. Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改

    java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理. ...

  3. Spark ALS recommendForAll源码解析实战之Spark1.x vs Spark2.x

    文章目录 Spark ALS recommendForAll源码解析实战 1. 软件版本: 2. 本文要解决的问题 3. 源码分析实战 3.1 Spark2.2.2 ALS recommendForA ...

  4. selenium 学习、工作 记录,附常见异常和工具方法

    selenium 学习.工作 记录,附常见异常和工具方法 基础配置 2020.03.31 开发者模式 设置有认证的http代理 让selenium接管人为打开的chrome 2020.07.23(79 ...

  5. Flink常见异常和错误信息小结

    大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! Flink的常见异常众多,不可能面面俱到,所以想到哪儿写到哪儿,有漏掉的之后再补充. 部署和资源问题 ...

  6. 绝地求生服务器维护错误,哪些是绝地求生常见异常解决方案?

    现在一款黑马游戏当属绝地求生,对于绝地求生常见异常问题,腾讯电脑管家官网也整理出一套方案,具体是什么方案?能够解决绝地求生常见异常吗?接下来和小编一起来看看吧. 主要症状 绝地求生玩不了,出现各种错误 ...

  7. Android 常见异常及解决办法

    Ø  前言 本文主要记录 Android 的常见异常及解决办法,以备以后遇到相同问题时可以快速解决. 1.   java.lang.NullPointerException: Attempt to i ...

  8. 初学Python常见异常错误,总有一处你会遇到!

    初学Python常见异常错误,总有一处你会遇到! 参考文章: (1)初学Python常见异常错误,总有一处你会遇到! (2)https://www.cnblogs.com/xxpythonxx/p/1 ...

  9. Cloudera Manager 常见异常

    Cloudera Manager 常见异常 参考文章: (1)Cloudera Manager 常见异常 (2)https://www.cnblogs.com/lemonu/p/10332962.ht ...

最新文章

  1. 十年磨一剑,可重构计算架构将引领未来芯片市场
  2. iOS私有Api检测
  3. 自己写分布式配置中心(上篇)- 单机模式
  4. 个人分析美国电脑销售现状(网店)
  5. Redis分布式锁,看完不懂你打我
  6. mysql set 常用参数_mysql常见配置参数
  7. 解决spring和struts配合问题
  8. 公司消费一卡通“变法”记
  9. android studio syso快捷键,AndroidStudio代码段简写Live Template
  10. luogu1082 [NOIp2012]同余方程 (扩展欧几里得)
  11. mysql 数据舍取_mysql取舍索引
  12. SAP License:跨行如何转入SAP
  13. Postman安装与简单使用
  14. 微信小程序 转发 分享功能
  15. 点击reset按钮失效 input 和 button元素 作为提交、重置、按钮功用的区别
  16. 解决最新小马激活工具导致主页劫持问题
  17. 说说你对keep-alive的理解是什么?
  18. linux speedtest-cli测速报错
  19. 求1~n中0~9出现的次数
  20. A001 - 基础 - 交换机原理简述

热门文章

  1. matlab降噪报告,基于matlab主动降噪实验.docx
  2. TL-WR740N_V4板TTL刷机指南_TFTP
  3. 国家自然科学基金 计算机视觉,我院教师焦红伟获批2018年国家自然科学基金面上项目...
  4. 中基鸿业分析投资应该注意的事项
  5. java中protect是什么_Java中public、private、protecte、default、public void是什么意思 | 学步园...
  6. win7怎么连接不上宽带连接服务器未响应,宽带连接不上,教您怎么解决宽带连接不上...
  7. 对话驴评网CEO崔继蓉:在线旅游的前途在移动端
  8. 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
  9. SSM实现养老院管理系统
  10. unity 3d游戏开发_使用Unity 5开发3D游戏