Spark解决SQL和RDDjoin结果不一致问题(工作实录)
问题描述:DataFrame的join结果不正确,dataframeA(6000无重复条数据) join dataframeB(220条无重复数据,由dataframeA转化而来,key值均源于dataframeA) 只有200条数据,丢了20条
问题验证:
1,查询丢的20条数据,均无异常,不存在Null,数据不存在空格
2,重新运行算法,丢18条数据,证明丢数据存在一定随机性
3,简化问题到最简模式,代码如下:
val xxx1= phySiteEvaluationPhySiteKey.select("physitekey").distinct()
val xxx2= physitefinal.select("physitekey").distinct()
val xxx3 = xxx1.join(xxx2, Seq("physitekey"))
val rdd1=xxx1.rdd.map(r=>r.getAs[String]("physitekey")).map(r=>(r,r))
val rdd2 =xxx2.rdd.map(r=>r.getAs[String]("physitekey")).map(r=>(r,r))
val rdd3=rdd1.join(rdd2)
log.info(s"rdd3=${rdd3.count()}")
log.info(s"xxx3==${xxx3.count()}")
xxx3和rdd3的结果居然不相等!!违背了spark常识
问题分析:
1,据spark原理可知,DataFrame的底层实现就是RDD,具体实现在Catalyst包类,需要DataFrame=>未解析的逻辑执行计划=>解析逻辑计划=>优化逻辑执行计划=>物理执行计划=>RDD执行
也就是说xxx3的执行计划生成出的RDD执行方案与RDD3结果不一致,因此在这里我打印了xxx3的执行计划,期望有所发现
xxx1.join(xxx2, Seq("physitekey")).explain()
执行计划长达1000多行,涉及内部实现因项目保密需要无法展示。
2,执行计划超长是因为phySiteEvaluationPhySiteKey、physitefinal均为迭代计算结果,不是直接来源于输入表
3,依据执行计划,我猜测Spark在逻辑计划优化的时候出错,导致结果不符合预期
4,验证方案:为xxx1、xxx2的取值加上checkpoint,斩断血缘依赖,重新查看执行计划是否符合预期
val xxx1= phySiteEvaluationPhySiteKey.select("physitekey").distinct().checkpoint()
val xxx2= physitefinal.select("physitekey").distinct().checkpoint()
xxx1.join(xxx2, Seq("physitekey")).explain()
val xxx3 = xxx1.join(xxx2, Seq("physitekey"))
val rdd1=xxx1.rdd.map(r=>r.getAs[String]("physitekey")).map(r=>(r,r))
val rdd2 =xxx2.rdd.map(r=>r.getAs[String]("physitekey")).map(r=>(r,r))
val rdd3=rdd1.join(rdd2)
log.info(s"rdd3=${rdd3.count()}")
log.info(s"xxx3==${xxx3.count()}")
结果执行计划如下:
== Physical Plan ==
*Project [physitekey#1648]
+- *SortMergeJoin [physitekey#1648], [physitekey#43875], Inner
:- *Sort [physitekey#1648 ASC NULLS FIRST], false, 0
: +- Exchange(coordinator id: 1135069612) hashpartitioning(physitekey#1648, 200), coordinator[target post-shuffle partition size: 67108864]
: +- *Filter isnotnull(physitekey#1648)
: +- Scan ExistingRDD[physitekey#1648]
+- *Sort [physitekey#43875 ASC NULLS FIRST], false, 0
+- Exchange(coordinator id: 1135069612) hashpartitioning(physitekey#43875, 200), coordinator[target post-shuffle partition size: 67108864]
+- *Filter isnotnull(physitekey#43875)
+- Scan ExistingRDD[physitekey#43875]
没有问题,RDD3与XXX3结果相等,正确了。
确认问题出在Spark中DataFrame在持有超长血缘关系时转化为RDD执行出错,具体错误有机会下次分析,应当是仅在一定特殊情况下才会暴露的BUG
5、问题反思
开源组件也是可能存在BUG的,应当在使用时尽量使用其最常见的用法,列如在本问题中,如果迭代计算之后及时斩断血缘依赖,就不会出现问题
Spark解决SQL和RDDjoin结果不一致问题(工作实录)的更多相关文章
- Spark(Hive) SQL数据类型使用详解(Python)
Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...
- Spark(Hive) SQL中UDF的使用(Python)
相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...
- Spark(Hive) SQL中UDF的使用(Python)【转】
相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...
- windows 系统本地做mysql 主从同步,最后面解决主从同步库名不一致,表结构一致
原文:windows 系统本地做mysql 主从同步,最后面解决主从同步库名不一致,表结构一致 mysql主从同步的好处以及原理 之前看到很多新闻说某某的服务器奔溃,磁盘碎了,导致数据丢失 ...
- Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 BINARY
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvo ...
- MyBatis(5)——解决属性名与列名不一致的问题
解决属性名与列名不一致的问题 问题描述: 当实体类的属性与数据库的列名不对应时取不到该列数据 说明:MyBatis会根据查询的列名设值(列名的setter方法),然后以此列名为做查询等操作,在此过程中 ...
- WARN deploy.SparkSubmit$$anon$2: Failed to load org.apache.spark.examples.sql.streaming.StructuredNetworkWordCount.
前言 今天运行Spark Structured Streaming官网的如下 ./bin/run-example org.apache.spark.examples.sql.streaming.Str ...
- IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)
IBatis解决SQL注入(#与$的区别) 在IBatis中,我们使用SqlMap进行Sql查询时,需要引用参数,在参数引用中可以使用两种占位符#和$.这两种占位符有什么区别呢? (1):#***#, ...
- Spark之SQL解析(源码阅读十)
如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...
随机推荐
- DNSPod DDNS 动态域名设置
所谓动态域名,就是当你的服务器 IP 地址发生变化的时候,自动地修改你在「域名解析服务商」那里的域名记录值 怎么操作?看官方文档 DNSPod用户API文档 首先需要创建 Token 完整的 API ...
- javaScript知识储备
javaScript知识储备 组成 ECMAScript(核心) 提供语法.变量等,遵循ECMA-262标准 DOM(文档对象模型) 提供操作HTML标签的API,遵循W3C规范 BOM(浏览器对象模 ...
- 我用MRS-ClickHouse构建的用户画像系统,让老板拍手称赞
摘要:在移动互联网时代,用户数量庞大,标签数量众多,用户标签的数据量巨大.用户画像系统中,对于标签的存储和查询,不同的企业有不同的实现方案.当前主流的实现方案采用ElasticSearch方案.但基于 ...
- 集合Collection ----Set集合
set系列集合:添加的元素是 无序,不重复,无索引的 ----HashSet: 无序,不重复,无索引 ------LinkHashSet<>:有序不重复无索引(添加顺序) ----Tree ...
- XSS注入
XSS 原理: 程序对输入和输出没有做合适的处理,导致"精心构造"的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害. 分类 : 危害:存储型 > 反射型 > ...
- 解决wampserver无法启动问题
如果无法启动,找不到原因.直接依次点击打开到:控制面板--管理工具--事件查看器--windows日志--应用程序,查看对应进程错误信息对症下药即可. 我这个错误就是8099端口错误,运行cmd命令, ...
- mysql给数据库表里某个字段赋随机值
UPDATE sxz_goods set sales_volume_base = round(rand() * 50) + 1 where sales_volume_base =0 ORDER BY ...
- js模块化开发 AMD CMD Commonjs
在es6全面实行开来之前 js实现模块开发方案有: 1.AMD 异步模块开发定义 依赖前置,requireJs应用了这一规范 require([module], callback); 加载完后回调 ...
- selenium--常用的获取元素属性
当我们要设计功能测试用例时,一般会有预期结果,有些预期结果测试人员无法通过肉眼进行判断的.因为自动化测试运行过程是无人值守,一般情况下,脚本运行成功,没有异样信息就标识用户执行成功.那怎么才能知道我打 ...
- Hyper-V CPU设置
前言 最近在用Hyper-V测试项目,发现在运行过程中发现项目总数崩掉,几经发现有一个共性,CPU占用率100%,分析问题发现问题出在Hyper-V CPU设置上,Hyper-V装系统就不赘述了,网上 ...