作家
登录

Spark 1.6升级2.x防踩坑指南

作者: 来源: 2017-10-24 14:21:42 阅读 我要评论

2.x中默认不支撑笛卡尔积操作,须要经由过程参数spark.sql.crossJoin.enabled开启

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!


Spark 1.6进级2.x防踩坑指南

CAST一个不存在的日期返回null,如:year('2015-03-40'),在1.6中返回2015

  • Spark 2.x不许可在VIEW中应用临时函数(temp function)https://issues.apache.org/jira/browse/SPARK-18209
  • Spark 2.1今后,窗口函数ROW_NUMBER()必须要在OVER内添加ORDER BY,以前的ROW_NUMBER() OVER()履行会报错
  • Spark 2.1今后,SIZE(null)返回-1,之前的版本返回null

计算精确性

那些进级后,让你认为心中有切切只草泥马奔跑而过的问题

  • SELECT '0.1' = 0返回的是true!Spark 2.2中,0.1会被转换为int,如不雅你的数据类型全部是文本类型,做数值计算时,结不雅极有可能不精确。之前的版本中0.1会被转换为double类型绝大年夜多半场景下如许的处理是精确的。今朝为止,社区还没有很好的处理这个问题,针对这个问题,我给社区提交过一个PR,想要本身解决这个问题的同窗,可以手动归并下:https://github.com/apache/spark/pull/18986
  • 过于复杂的SQL语句履行可能会出现64KB字节码编译限制的问题,这算是个老问题了,Spark自负年夜上了Tungsten根本上一向存在这个问题,也算是受到了JVM的限制,碰到词攀类问题,建议大年夜家找找PR:https://github.com/apache/spark/search?utf8=%E2%9C%93&q=64KB&type=Issues
  • 数据计算精度有问题,SELECT 1 > 0.0001会报错,这个问题已在2.1.2及2.2.0中修复:https://issues.apache.org/jira/browse/SPARK-20211
  • 2.1.0版本中INNER JOIN涉及到常量计算结不雅不精确,后续版本已修复:https://issues.apache.org/jira/browse/SPARK-19766
  • 2.1.0中,履行GROUPING SET(col),如不雅col列数据为null,会报空指针异常,后续版本已修复:https://issues.apache.org/jira/browse/SPARK-19509
  • 2.1.0中,嵌套的CASE WHEN语句履行有可能掉足,后续版本已修复:https://issues.apache.org/jira/browse/SPARK-19472

行动变更

那些不算太致命,改改代码或设备就可以兼容的问题。

  • Spark 2.2的UDAF实现有所更改,如不雅你的Hive UDAF没有严格按照标准实现,有可能管帐算报错或数据不精确,建议将逻辑迁徙到Spark AF,同时也能获得更好的机能
  • Spark 2.1开端全表攫取分区表采取FilePartition的方法,单个Partition内可以攫取多个文件,如不雅对文件做了紧缩,这种方法有可能导致萌芽机能变差,可以恰当降低spark.sql.files.maxPartitionBytes的值,默认是128MB(对于大年夜部分的Parquet紧缩表来说,这个默认设置其实会导致机能问题)
  • Spark 2.x限制了Hive表中spark.sql.*相干属性的操作,明明存在的属性,应用SHOW TBLPROPERTIES tb("spark.sql.sources.schema.numParts")无法获取到,同理也无法履行ALTER TABLE tb SET TBLPROPERTIES ('spark.sql.test' = 'test')进行修改
  • 无法修改外部表的属性ALTER TABLE tb SET TBLPROPERTIES ('test' = 'test')这里假设tb是EXTERNAL类型的表
  • DROP VIEW IF EXISTS tb,如不雅这里的tb是个TABLE而非VIEW,履行会报错AnalysisException: Cannot drop a table with DROP VIEW,在2.x以下不会报错,因为我们指定了IF EXISTS关键字,这里的报错显然不合理,须要做异常处理。
  • 如不雅你拜访的表不存在,异常信息在Spark2.x里由之前的Table not found变成了Table or view not found,如不雅你的代率攀里依烂魅这个异常信息,就须要留意调剂了。
  • EXPLAIN语句的返回格局变掉落了,在1.6里是多行文本,2.x中是一行,并且内容格局也有稍微的变更,比拟Spark1.6,少了Tungsten关键字;EXPLAIN中显示的HDFS路径过长的话,在Spark 2.x中会被省略为...

Spark SQL是Spark中最重要的模块之一,根本上Spark每个版本宣布SQL模块都有不少的修改,并且官网还会附带一个Migration Guide协助大年夜家进级。问题在于Migration Guide并没有详尽的列出所有更改,本文以SQL模块为主,扒一扒Spark进级2.x过程中可能会踩到的坑。

OLAP分析中常用的GROUPING__ID函数在2.x变成了GROUPING_ID()

如不雅你有一个基于Hive的UDF名为abc,有3个参数,然后又基于Spark的UDF实现了一个2个参数的abc,在2.x中,2个参数的abc会覆盖掉落Hive中3个参数的abc函数,1.6则不会有这个问题

履行类似SELECT 1 FROM tb GROUP BY 1的语句会报错,须要零丁设置spark.sql.groupByOrdinal false类似的参数还有spark.sql.orderByOrdinal false

CREATE DATABASE默认路径产生了变更,不在大年夜hive-site.xml攫取hive.metastore.warehouse.dir,须要经由过程Spark的spark.sql.warehouse.dir设备指定命据库的默认存储路径。

Parquet文件的默认紧缩算法由gzip变成了snappy,据官方说法是snappy有更好的萌芽机能,大年夜家须要本身验证机能的变更

DESC FORMATTED tb返回的内容有所变更,1.6的格局和Hive比较切近,2.x平分两列显示

异常信息的变更,不决义的函数,Spark 2.x: org.apache.spark.sql.AnalysisException: Undefined function: 'xxx’., Spark 1.6: AnalysisException: undefined function xxx,参数格局缺点:Spark 2.x:Invalid number of arguments, Spark 1.6: No handler for Hive udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDAFXXX because: Exactly one argument is expected..


  推荐阅读

  Go语言的9大优势和3大缺点

转用一门新说话平日是一项大年夜决定计划,尤其是当你的团队成员中只有一个应用过它时。本年 Stream 团队的重要编程说话大年夜 Python 转向了 Go。本文说清楚明了其背后的九大年夜原因以及若何做好这一>>>详细阅读


本文标题:Spark 1.6升级2.x防踩坑指南

地址:http://www.17bianji.com/lsqh/38137.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)