SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】

77 篇文章 222 订阅
72 篇文章 119 订阅

目录

0 问题描述

1 数据分析

2 小结


0 问题描述

1 数据分析

(1)数据准备

create table log
(
  uid string,
  ip string,
  time string
)row format delimited
fields terminated by '\t';

insert into log values
('a', '124', '2019-08-07 12:0:0'),
('a', '124', '2019-08-07 13:0:0'),
('b', '124', '2019-08-08 12:0:0'),
('c', '124', '2019-08-09 12:0:0'),
('a', '174', '2019-08-10 12:0:0'),
('b', '174', '2019-08-11 12:0:0'),
('a', '194', '2019-08-12 12:0:0'),
('b', '194', '2019-08-13 13:0:0'),
('c', '174', '2019-08-14 12:0:0'),
('c', '194', '2019-08-15 12:0:0')
;

hive> select * from log;
OK
a	124	2019-08-07 12:00:00
a	124	2019-08-07 13:00:00
b	124	2019-08-08 12:00:00
c	124	2019-08-09 12:00:00
a	174	2019-08-10 12:00:00
b	174	2019-08-11 12:00:00
a	194	2019-08-12 12:00:00
b	194	2019-08-13 13:00:00
c	174	2019-08-14 12:00:00
c	194	2019-08-15 12:00:00
Time taken: 0.053 seconds, Fetched: 10 row(s)

(2)共同使用问题,一般涉及到该字眼的都是需要一对多,此类问题解决的核心逻辑是自关联。

1)获取自关联后的结果集

select 
    t1.uid as uid_1, t1.ip, t2.uid as uid_2
  from 
    (select uid, ip from log group by uid, ip) t1 join
    (select uid, ip from log group by uid, ip) t2 
  on
    t1.ip = t2.ip
--------------------------------------------------------------------------------
OK
a	124	a
a	124	c
a	124	b
a	174	a
a	174	c
a	174	b
a	194	a
a	194	c
a	194	b
b	124	a
b	124	c
b	124	b
b	174	a
b	174	c
b	174	b
b	194	a
b	194	c
b	194	b
c	124	a
c	124	c
c	124	b
c	174	a
c	174	c
c	174	b
c	194	a
c	194	c
c	194	b
Time taken: 8.808 seconds, Fetched: 27 row(s)

2)由于数据会两两出现,如a,b和b,a实际上是一样的,过滤掉这部分重复数据,只需要选出t1.uid < t2.uid即可,也就是a,b的数据.hive中不支持不等连接,所以选where语句

select 
    t1.uid as uid_1, t1.ip, t2.uid as uid_2
  from 
    (select uid, ip from log group by uid, ip) t1 join
    (select uid, ip from log group by uid, ip) t2 
 where
    t1.ip = t2.ip and t1.uid < t2.uid
	
OK
a	124	c
a	124	b
a	174	c
a	174	b
a	194	c
a	194	b
b	124	c
b	174	c
b	194	c
Time taken: 16.193 seconds, Fetched: 9 row(s)

 3)按照组合键分组,并过滤出符合条件的用户。最终SQL如下:

select m.uid_1,m.uid_2 
from(
 select 
    t1.uid as uid_1, t1.ip, t2.uid as uid_2
  from 
    (select uid, ip from log group by uid, ip) t1 join
    (select uid, ip from log group by uid, ip) t2 
 where
    t1.ip = t2.ip and t1.uid < t2.uid
) m
group by m.uid_1,m.uid_2 
having count(ip) >= 3
--------------------------------------------------------------------------------
OK
a	b
a	c
b	c
Time taken: 11.073 seconds, Fetched: 3 row(s)

2 小结

本题的特征为"共同使用",诸如此类两两相遇,共同,相互认识等关键字时候,往往采用自关联解决,这类问题的共同特征往往包含一对多,需要组合出各种情况。相关类问题可参考如下链接:https://blog.csdn.net/godlovedaniel/article/details/119155757

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用Spark实现HQL时,我们发现Order by和Sort by操作会导致性能问题。这是因为这两个操作需要对数据进行全局排序,而全局排序需要将所有数据都加载到内存中,这会导致内存压力过大,从而影响性能。为了解决这个问题,我们可以采用分区排序的方式,将数据分成多个分区,每个分区内部进行排序,然后再将各个分区的数据合并起来,这样可以减少内存压力,提高性能。另外,我们还可以通过调整分区大小、增加缓存等方式来进一步优化性能。 ### 回答2: SQL优化在数据处理中至关重要,它可以提高底层查询引擎的性能和效率。但是,在Spark实现HQL时,我们会发现order by和sort by会带来性能问题。那么,如何解决这些问题呢? 首先,让我们明确一点,order by和sort by本身并不会导致性能问题。它们的性能问题主要与数据的大小和处理方式有关。在Spark中,order by和sort by的工作方式类似。它们都需要对数据进行重新排序才能执行。但是,对大量数据进行排序需要消耗大量的时间和计算资源。因此,在Spark中,我们需要使用一些技巧来优化order by和sort by的性能。 下面是一些使用Spark优化order by和sort by的技巧: 1. 对于order by,使用分区规则 在Spark中,对数据进行分区可以将大量的数据分成多个小块。这样可以将处理工作负载分散到多台计算机上,从而提高处理效率。因此,在执行order by时,使用分区可以有效减少排序的性能问题。 2. 对于sort by,使用前缀规则 sort by通常会导致内存问题。当内存不足时,Spark会将数据写入到磁盘上,而磁盘读取速度比内存慢得多,从而导致性能降低。为了解决内存问题,我们可以使用前缀规则。前缀规则指的是将数据按照一定规则划分为多个小组,然后在每个小组内部进行排序。这样可以将内存使用降低到最小并且减少磁盘I/O。 3. 使用默认分区规则 Spark和Hadoop默认使用block做为分块后的存储单元。可以使用默认的分区规则,然后使用sort-by-key命令即可完成查找排序。 综上所述,优化order by和sort by的性能是很有必要的。使用分区规则、前缀规则和默认分区规则可以有效地降低Spark执行order by和sort by时的性能问题。在实践中,还可以根据具体的需求进行横向拆分(即将查询结果拆分),以提高处理效率。这里用到的数据决定了查询的数据量,缓存,则会优化再多查询,但有些查询导致的数据CGgrow还是无法避免的。 ### 回答3: 在使用Spark进行HQL时,我们可能会遇到一些性能问题,尤其是在使用order by和sort by时。这些操作需要对数据进行排序,对于大数据量的数据集,排序的开销是非常大的,可能会导致任务运行缓慢或者甚至失败。因此,为了优化性能,我们可以采取以下措施: 1.使用分区排序:在进行排序之前,我们可以先对数据进行分区,将相近的数据放在同一分区中,这样可以减少排序的数据集大小,提高排序的效率。 2.使用缓存机制:如果我们进行多次排序时,可以将数据集缓存在内存中,避免多次读取磁盘文件,减少IO开销,提高查询效率。 3.使用外部排序:如果我们需要对大型数据集进行排序,可以使用外部排序,该排序算法可以将数据切分为较小的块,对每个块进行排序,最终将块合并为完整数据集,这样可以减少排序的数据量,提高效率。 4.使用索引:如果我们需要经常按照某个字段进行排序,可以在该字段上建立索引,这样可以加快排序的速度。 同时,我们还需要注意以下几点: 1.数据类型转换:在进行排序之前,需要将所有数据转换为相同的数据类型,否则可能会导致排序结果不准确或出现错误。 2.数据采样:在对大型数据集进行排序之前,可以先对数据子集进行采样,以确定排序的正确性和可行性。 3.调整JVM参数:可以通过调整JVM参数(如内存的分配和垃圾回收机制)来优化排序的性能。 总之,对于order by和sort by操作,我们需要结合具体的情况来进行优化,有效地减少排序的开销,提高任务的执行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值