前言

这里记录一下使用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的问题相关推荐

  1. MYSQL注入天书之order by后的injection

    Background-9  order by后的injection 此处应介绍order by后的注入以及limit注入,我们结合less-46更容易讲解,(在less46中详细讲解)所以此处可根据l ...

  2. MySQL中order by中关于NULL值的排序问题

    MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...

  3. 进入固定资产卡片管理双击卡片后提示“null无效

    T66.1版本,原始卡片使用软件自带导入功能导入,进入固定资产卡片管理双击卡片后提示"null"无效,经跟踪数据库后发现为表fa_cards中有一列dbltransdeprt值为N ...

  4. SQL:开窗排序,在order by 后加判断条件的作用是什么?

    场景 在生产中,经常会看到窗口函数中对排序字段加 is not null 判断,类似这样的sql代码: select *,row_number() over(partition by id order ...

  5. php order by where,无合适where条件过滤时尽量选择order by后的字段以驱动表进行查询...

    后台查询语句SELECTo.orders_id,s.orders_status_name,ot.text,af.affiliate_idFROMordersoLEFTJOINorders_totalo ...

  6. SurfaceControl.screenshot()用法和SurfaceControl.screenshot()使用后返回null的情况

    前言 SurfaceControl.screenshot()是系统的截屏方法,属于系统API,对用户不开放,因此要使用的话需要系统的签名(platform.keystore文件)才能调用到. 在高版本 ...

  7. 后台管理系统导出数据列表返回二进制数据,下载后为null

    导出文件,后台返回二进制数据 前台ajax请求需要设置 responseType: arraybuffer ArrayBuffer对象,表示通用的.固定长度的原始二进制数据缓冲区.ArrayBuffe ...

  8. mysql 优先队列_深入浅出 MySQL 优先队列(你一定会踩到的order by limit 问题)

    英语和算法是程序员的两条腿 本文适用于 MySQL 5.6 及以上版本 0.先抛问题 假设字段category无索引且有重复值,order by category 和limit组合使用的结果会和预期不 ...

  9. 走向.NET架构设计—第四章—业务层分层架构(后篇)

    走向.NET架构设计-第四章-业务层分层架构(后篇) 前言: 在上一篇文章中,我们讨论了组织业务逻辑的模式:Transaction Script和Active Record,Domain Model. ...

最新文章

  1. FOSCommentBundle功能包:设置Doctrine ODM映射(投票)
  2. fpga如何约束走线_FPGA中的CLOCK REGION和SLR是什么含义
  3. IT兄弟连 JavaWeb教程 Servlet转发
  4. html4视频测试方法,3.4 处理视频 - HTML5 Canvas 实战
  5. python数据运算
  6. microsoft vbscript编译器错误怎么解决_win7系统ie应用程序错误怎么办 ie应用程序错误解决方法【详解】...
  7. 在石家庄扣完五险一金到手5000,算什么水平?
  8. matlab的数据类型ppt,MATLAB数据类型
  9. 求方阵的鞍点(即在行最小列最大的那个点)
  10. 直线检测原理matlab,Hough变换 直线检测原理及其Matlab实现
  11. 开放源代码软件及其许可证
  12. 电商业务Alipay支付实战(当面付实现)
  13. 个人支付接口现状分析——如何选择一个靠谱的个人支付接口
  14. 程序员月薪过7万,可以落户北京了
  15. H3C BGP与IGP交互配置
  16. from __future__ import unicode_literals
  17. html如何快速转pDF,如何快速实现pdf转html网页文件 高能方法帮你解决80%职场难题...
  18. Windows登录多微信
  19. GraphQL学习第三篇 -在Express中使用GraphQL
  20. deepFM model

热门文章

  1. ImportError: cannot import name UnrewindableBodyError
  2. PYTHON博客记录0602
  3. iOS 对 HTTPS 证书链的验证
  4. AJAX实例演示加载xml
  5. Visual Studio 11更名为“Visual Studio 2012”,RC版(与.NET 4.5一起)开放下载
  6. FTPClient.listFiles()不能获取目录里的文件
  7. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG
  8. 30个要点帮你完成java代码优化
  9. 树、森林和二叉树之间的转换
  10. 获取经纬度之间距离的Java工具类