Hive SQL去重a,b和b,a类型
admin
2023-04-22 21:04:13
0

昨天开发找到我们DBA,要我们写一条Hive SQL。


需求:

有一个t表,主要有机场名称airport,机场的经纬度distance这两个列组成,想得到所有距离小于100的两个机场名。


其实写这个SQL的逻辑并不是很困难,难点是如何去重复值,

我用MySQL模拟的一个表,其实Hive语法和SQL差不多,插入了三条数据,a, b, c 分别代表三个机场名称,结构如下:


mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `airport` varchar(10) DEFAULT NULL,
  `distant` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 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


相关内容

热门资讯

终于懂了“吉林白山麻将辅助器?... 家人们!今天小编来为大家解答吉林白山麻将透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里...
最新引进“笑傲江湖开挂神器?”... 您好:笑傲江湖这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游戏...
今日重磅消息“来趣广西麻将到底... 您好:来趣广西麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款...
今日重磅消息“麻辣竞技究竟有挂... 有 亲,根据资深记者爆料麻辣竞技是可以开挂的,确实有挂(咨询软件无需打开...
终于懂了“南通快胡麻将究竟有挂... 终于懂了“南通快胡麻将究竟有挂吗?”(详细开挂教程)您好,南通快胡麻将这个游戏其实有挂的,确实是有挂...
【第一财经】“么么都莱游戏怎么... 有 亲,根据资深记者爆料么么都莱游戏是可以开挂的,确实有挂(咨询软件无需...
【第一财经】“同城游比鸡真的有... 【第一财经】“同城游比鸡真的有挂吗?”(必胜开挂神器)您好,同城游比鸡这个游戏其实有挂的,确实是有挂...
【第一资讯】“游戏茶苑真的有挂... 有 亲,根据资深记者爆料游戏茶苑是可以开挂的,确实有挂(咨询软件无需打开...
最新引进“天天福州十三水到底有... 您好:天天福州十三水这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这...
今日重大发现“美猴王拼三张有挂... 有 亲,根据资深记者爆料美猴王拼三张是可以开挂的,确实有挂(咨询软件无需...