Order By后产生NULL的问题
前言
这里记录一下使用Spark-Shell查询Hive中数据时遇到的一点点问题,Hive表中一个字段的数据如下:
+--------------+
| register_time|
+--------------+
|20190824192307|
|20151220134432|
|20150909235908|
|20150418125129|
|20150101103333|
|20140925173645|
|20150628155606|
|20150602170012|
|20180807102621|
|20170506102100|
|20141121074350|
|20151211102837|
|20131230144052|
|20140322135851|
|20151130130000|
|20160823210000|
|20160625210000|
|20160602180000|
|20150927113839|
|20150121181824|
+--------------+
数据特征如下:
长度14,不过里面有NULL值和‘’值,还有一些长度不为14的脏数据
操作一
sql(sqlText = "select register_time from ods.ods_user_5_tuple_m").filter("length(register_time) = 14") //过滤掉空值和脏数据.select($"register_time".cast("int")).orderBy($"register_time").show()
结果:
+-------------+
|register_time|
+-------------+
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
+-------------+
这个字段长度14,而int长度仅为10,因此这里显示全为null值,就合理了
操作二
sql(sqlText = "select register_time from ods.ods_user_5_tuple_m").filter("length(register_time) = 14") //过滤掉空值和脏数据.select($"register_time".cast("long")).orderBy($"register_time").show()
结果
+-------------+
|register_time|
+-------------+
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
| null|
+-------------+
这个真的很奇怪,我在第一步已经把长度定为14,为什么后面还有null?(文章后面有说明)
使用 asc_nulls_last把null值放在最后
sql(sqlText = "select register_time from ods.ods_user_5_tuple_m").filter("length(register_time) = 14").select($"register_time".cast("long")).orderBy($"register_time".asc_nulls_last).show()
结果:
+--------------+
| register_time|
+--------------+
| 10101000000|
| 10101000000|
| 10101000000|
| 10101000000|
| 10101000000|
| 10101000000|
| 10101000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
+--------------+
竟然有结果了,但是,长度依然不全是14
说明:
Spark中的asc_nulls_last类似于SQL中的NULLS LAST
将长度限定放在类型转换之后
sql(sqlText = "select register_time from ods.ods_user_5_tuple_m").select($"register_time".cast("long")).filter("length(register_time) = 14").orderBy($"register_time").show()
结果:
+--------------+
| register_time|
+--------------+
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
+--------------+
这个时候,一切正常了
整个流程问题追踪
1.为什么使用length函数后,里面有一堆null
原因就是length函数统计字符串的时候,如果底层为\N存储,那么显示出来的就是NULL,只要使用trim函数即可
sql(sqlText = "select register_time from ods.ods_user_5_tuple_m").where("length(trim(register_time)) = 14").show()
结果:
+--------------+
| register_time|
+--------------+
|20151128083141|
|20140309165232|
|20140416120642|
|20170210183403|
|20150719182910|
|20150502161826|
|20140920213016|
|20150628091716|
|20140526220130|
|20141109173058|
|20141019182158|
|20160501185629|
|20160801185911|
|20160302144822|
|20150807180000|
|20141030213002|
|20150510101610|
|20150510112424|
|20141019204319|
|20150101111359|
+--------------+
2.将长度限定放在类型转换之前为什么不行?
很明显,这个字符串前面本来就是以0开头的,长度本来是14,但是已转换为long,则把前面的0就去掉了
sql(sqlText = "select register_time from ods.ods_user_5_tuple_m").where("length(trim(register_time)) = 14")//.select($"register_time".cast("long")).orderBy($"register_time".asc_nulls_last).show()
结果:
+--------------+
| register_time|
+--------------+
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|00010101000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
|17520913000000|
+--------------+
后记
Hive中的Null值和’'的具体细节请参考
Order By后产生NULL的问题相关推荐
- MYSQL注入天书之order by后的injection
Background-9 order by后的injection 此处应介绍order by后的注入以及limit注入,我们结合less-46更容易讲解,(在less46中详细讲解)所以此处可根据l ...
- MySQL中order by中关于NULL值的排序问题
MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...
- 进入固定资产卡片管理双击卡片后提示“null无效
T66.1版本,原始卡片使用软件自带导入功能导入,进入固定资产卡片管理双击卡片后提示"null"无效,经跟踪数据库后发现为表fa_cards中有一列dbltransdeprt值为N ...
- SQL:开窗排序,在order by 后加判断条件的作用是什么?
场景 在生产中,经常会看到窗口函数中对排序字段加 is not null 判断,类似这样的sql代码: select *,row_number() over(partition by id order ...
- php order by where,无合适where条件过滤时尽量选择order by后的字段以驱动表进行查询...
后台查询语句SELECTo.orders_id,s.orders_status_name,ot.text,af.affiliate_idFROMordersoLEFTJOINorders_totalo ...
- SurfaceControl.screenshot()用法和SurfaceControl.screenshot()使用后返回null的情况
前言 SurfaceControl.screenshot()是系统的截屏方法,属于系统API,对用户不开放,因此要使用的话需要系统的签名(platform.keystore文件)才能调用到. 在高版本 ...
- 后台管理系统导出数据列表返回二进制数据,下载后为null
导出文件,后台返回二进制数据 前台ajax请求需要设置 responseType: arraybuffer ArrayBuffer对象,表示通用的.固定长度的原始二进制数据缓冲区.ArrayBuffe ...
- mysql 优先队列_深入浅出 MySQL 优先队列(你一定会踩到的order by limit 问题)
英语和算法是程序员的两条腿 本文适用于 MySQL 5.6 及以上版本 0.先抛问题 假设字段category无索引且有重复值,order by category 和limit组合使用的结果会和预期不 ...
- 走向.NET架构设计—第四章—业务层分层架构(后篇)
走向.NET架构设计-第四章-业务层分层架构(后篇) 前言: 在上一篇文章中,我们讨论了组织业务逻辑的模式:Transaction Script和Active Record,Domain Model. ...
最新文章
- FOSCommentBundle功能包:设置Doctrine ODM映射(投票)
- fpga如何约束走线_FPGA中的CLOCK REGION和SLR是什么含义
- IT兄弟连 JavaWeb教程 Servlet转发
- html4视频测试方法,3.4 处理视频 - HTML5 Canvas 实战
- python数据运算
- microsoft vbscript编译器错误怎么解决_win7系统ie应用程序错误怎么办 ie应用程序错误解决方法【详解】...
- 在石家庄扣完五险一金到手5000,算什么水平?
- matlab的数据类型ppt,MATLAB数据类型
- 求方阵的鞍点(即在行最小列最大的那个点)
- 直线检测原理matlab,Hough变换 直线检测原理及其Matlab实现
- 开放源代码软件及其许可证
- 电商业务Alipay支付实战(当面付实现)
- 个人支付接口现状分析——如何选择一个靠谱的个人支付接口
- 程序员月薪过7万,可以落户北京了
- H3C BGP与IGP交互配置
- from __future__ import unicode_literals
- html如何快速转pDF,如何快速实现pdf转html网页文件 高能方法帮你解决80%职场难题...
- Windows登录多微信
- GraphQL学习第三篇 -在Express中使用GraphQL
- deepFM model
热门文章
- ImportError: cannot import name UnrewindableBodyError
- PYTHON博客记录0602
- iOS 对 HTTPS 证书链的验证
- AJAX实例演示加载xml
- Visual Studio 11更名为“Visual Studio 2012”,RC版(与.NET 4.5一起)开放下载
- FTPClient.listFiles()不能获取目录里的文件
- FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG
- 30个要点帮你完成java代码优化
- 树、森林和二叉树之间的转换
- 获取经纬度之间距离的Java工具类