Hive SQL去重a,b和b,a类型
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,昨天开发找到我们DBA,要我们写一条Hive SQL。需求:有一个t表,主要有机场名称airport,机场的经纬度distance这两个列组成,想得到所有距离小于100的两个机场名。其实写这个SQL的
千家信息网最后更新 2026年11月02日Hive SQL去重a,b和b,a类型
昨天开发找到我们DBA,要我们写一条Hive SQL。
需求:
有一个t表,主要有机场名称airport,机场的经纬度distance这两个列组成,想得到所有距离小于100的两个机场名。
其实写这个SQL的逻辑并不是很困难,难点是如何去重复值,
我用MySQL模拟的一个表,其实Hive语法和SQL差不多,插入了三条数据,a, b, c 分别代表三个机场名称,结构如下:
mysql> show create table t\G*************************** 1. row *************************** Table: tCreate Table: CREATE TABLE `t` ( `airport` varchar(10) DEFAULT NULL, `distant` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)mysql> select * from t;+---------+---------+| airport | distant |+---------+---------+| a | 130 || b | 140 || c | 150 |+---------+---------+3 rows in set (0.00 sec)
通过!=筛选掉本机场自己之间的比较,用abs函数取绝对值得到位置小于100的两个机场
mysql> select t1.airport, t2.airport from t t1,t t2 where t1.airport != t2.airport and abs(t1.distant-t2.distant) < 100;+---------+---------+| airport | airport |+---------+---------+| b | a || c | a || a | b || c | b || a | c || b | c |+---------+---------+6 rows in set (0.00 sec)
但是问题来了,(b,a) 与(a,b),(c,a)与(a,c),(c,b)与(b,c)这里被我们视为重复值,我们只需要得到其中某一行的数据,就知道是哪两个机场名了,那么,如何去掉这个重复值呢?
貌似distinct,group by都派不上用场了,最后咨询了一位资深的SQL高手,找到了这么一个函数hex(),可以把一个字符转化成十六进制,Hive也有对应的函数,效果如下:
mysql> select t1.airport,hex(t1.airport), t2.airport,hex(t2.airport) from t t1,t t2 where t1.airport != t2.airport and abs(t1.distant-t2.distant) < 100;+---------+-----------------+---------+-----------------+| airport | hex(t1.airport) | airport | hex(t2.airport) |+---------+-----------------+---------+-----------------+| b | 62 | a | 61 || c | 63 | a | 61 || a | 61 | b | 62 || c | 63 | b | 62 || a | 61 | c | 63 || b | 62 | c | 63 |+---------+-----------------+---------+-----------------+6 rows in set (0.00 sec)
这样我们就可以通过比较机场1和机场2的大小,来去掉重复值了
mysql> select t1.airport, t2.airport from t t1,t t2 where t1.airport != t2.airport and hex(t1.airport) < hex(t2.airport) and abs(t1.distant-t2.distant) < 100;+---------+---------+| airport | airport |+---------+---------+| a | b || a | c || b | c |+---------+---------+3 rows in set (0.00 sec)
最后再优化一下,结果如下:
mysql> select t1.airport, t2.airport from t t1,t t2 where hex(t1.airport) < hex(t2.airport) and abs(t1.distant-t2.distant) < 100;+---------+---------+| airport | airport |+---------+---------+| a | b || a | c || b | c |+---------+---------+3 rows in set (0.00 sec)
SQL并不复杂,没有太多表的join和子查询,但是之前遇到去掉重复值用distinct或者group by就可以解决了,这次貌似不太适用,所以记录一下,欢迎拍砖。
参考链接
https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_hex
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inFunctions
机场
两个
函数
名称
数据
复杂
困难
差不多
一行
三个
之间
代表
位置
十六进制
可以通过
大小
字符
想得到
效果
用场
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
小米移动互联网科技园
互联网科技网
西安互联网科技
汇久创客互联网科技
猫创互联网科技
北京大学互联网科技怎么样
华服互联网科技官网
天津腾达互联网科技有限公司
工业互联网展湾科技股份有限公司
沐思想互联网科技有限公司
黑科技 体验场景 互联网大会
张召忠谈中国互联网科技
领航科技大厦互联网公司
工业互联网科技成果转化
九思连强互联网电子科技有限公司
唐山双旺合互联网科技产业园
安徽零酒互联网科技有限公司
杭州融税互联网科技有限公司
华人运通互联网科技公司
瑞安市蟠桃会互联网科技有限公司
小米移动互联网科技园
互联网和科技技术
深圳卡尔迅互联网科技有限公司怎么样
互联网和高科技公司
农村开互联网科技讲堂
现代互联网科技股
消费医药和互联网科技
北京市互联网新科技
北京互联网科技类企业分布
互联网科技对化妆品行业