【数据库】我需要一个查重效率高的方法

本人用的hive,可以理解为关系型数据库,现在的需求是,有一塔数据,数据中都有手机号,我需要看看这一沓数据中有哪些是数据里已经有了的。

目前我的做法是,先取一条,然后按照手机号遍历整张表,然后下一条,遍历,下一条,遍历。。。。。。

我觉得此法即使加了索引效率也很低,求一个效率高的sql,或者思路

10个回答

用分组查询不行吗,根据手机号码分组,总数大于1的就是有重复的

u011856283
你好杰米 最后我使用了先把数据插入到库里的一张临时表中,然后把临时表的数据和底层表的数据进行连接+group by,完成了功能
2 年多之前 回复

你可以把数据库中的所有手机号读出来,存到一个java集合数据结构中;再使用另外的一个集合数据结构存储手中的数据。
两个集合求交,就得到在数据库中的数据。求差就得到不在数据库中的数据。
这种方法只用读一次数据库。

Boover
Boover 回复你好杰米: 假设一个手机号占用11个字节(11位数字),百万量级的手机号码,存到内存里也就占用数十MB的空间。千万量级的话,大概占用数百MB的字节。问题应该不大。
2 年多之前 回复
u011856283
你好杰米 请问下,百万级的数据可以用这种方法吗,主要是数据量很多,而且是不断堆积的
2 年多之前 回复

你分组统计,然后再判断你统计大于1的数据。

我mysql SELECT * FROM (SELECT CASE WHEN COUNT(*)>1 THEN age END as number FROM user u GROUP BY u.age) t where t.number is NOT NULL

用distinct应该可以了,SELECT DISTINCT 列名称 FROM 表名称

Ocean_kyle
Ocean_kyle 回复l935206164: 用这个去重后的结果和原来的结果比对就可以了
2 年多之前 回复
l935206164
fate丶lee distinct是去重,他要知道那些是重复的
2 年多之前 回复

不懂hive

从数据库角度来考虑的话
SELECT phone ,
COUNT(*)
FROM ( SELECT phone
FROM t1
UNION ALL
SELECT phone
FROM t2
UNION ALL
SELECT phone
FROM t3
) a
GROUP BY phone
HAVING COUNT(*) > 1

从程序角度来考虑
添加一个hashtable,key为手机号码,value为重复次数。
循环所有你的表的手机号码,
如果手机号码不存在,添加进入hashtable
如果手机号码存在,把hashtable表对应的数量+1。
最后再循环hashtable,数量大于1的数据就是你需要的。

我记得一个算法,好像取数据集合(排序的),因为,手机号都是数字,按照数字的处理方式处理,直接比较数组下标也是可以的;重复的数据打印,并remove

lixiaozhen007
lixiaozhen007 我记得还可以奇数和偶数的一个算法的,也可以实现的
2 年多之前 回复
lixiaozhen007
lixiaozhen007 简单的说,就是数字的大小排序嘛,那个数字一样的,肯定再附近把,找到,直接打印,就可以了,这个算法不复杂的把
2 年多之前 回复

把“一塔数据”里的手机号码另外做一个映射, 存放的方式可以是内存中,缓存服务器,数据库。第一次建立映射可能需要一点时间,之后有更新维护即可,查询的时候都是毫秒级别的。
比如说:存储结构 【手机号】=》 【计数】, 查询计数大于1的 就是想要查询的结果

select * from table t where t.phone in (select t.phone from table t group by t.phone having count(*)>1)

这个不就是手机号码的woordcount吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问