本人用的hive,可以理解为关系型数据库,现在的需求是,有一塔数据,数据中都有手机号,我需要看看这一沓数据中有哪些是数据里已经有了的。
目前我的做法是,先取一条,然后按照手机号遍历整张表,然后下一条,遍历,下一条,遍历。。。。。。
我觉得此法即使加了索引效率也很低,求一个效率高的sql,或者思路
用分组查询不行吗,根据手机号码分组,总数大于1的就是有重复的
你可以把数据库中的所有手机号读出来,存到一个java集合数据结构中;再使用另外的一个集合数据结构存储手中的数据。
两个集合求交,就得到在数据库中的数据。求差就得到不在数据库中的数据。
这种方法只用读一次数据库。
你分组统计,然后再判断你统计大于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 表名称
不懂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
把“一塔数据”里的手机号码另外做一个映射, 存放的方式可以是内存中,缓存服务器,数据库。第一次建立映射可能需要一点时间,之后有更新维护即可,查询的时候都是毫秒级别的。
比如说:存储结构 【手机号】=》 【计数】, 查询计数大于1的 就是想要查询的结果
select * from table t where t.phone in (select t.phone from table t group by t.phone having count(*)>1)
这个不就是手机号码的woordcount吗?