锁屏面试题百日百刷-Hive篇(六)

​    锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步!接下来的是今日的面试题:

1.Hive join查询的时候on和where有什么区别

左右关联时:

• 条件不为主表条件时,放在on和where后面一样

• 条件为主表条件时,放在on后面,结果为主表全量,放在where后面为主表条件筛选过后的全量。

-- 1. select * from a left join b on a.id=b.id and a.dt=20181115; -- 2.select * from a left join b on a.id=b.id and b.dt=20181115; -- 3.select * from a join b on a.id=b.id and a.dt=20181115; -- 4.select * from a left join b on a.id=b.id where a.dt=20181115; -- sql1: 如果是left join 在on 上写主表a的条件不会生效,全表扫描。

-- sql2: 如果是left join 在 on 上写副表b的条件会生效,但是语义与写到where条件不同。

-- sql3: 如果是inner join 在on 上写主表a,副表b的条件都会生效。

-- sql4: 建议这么写,大家写sql 大部分的语义都是先过滤数据然后再join,所以在不了解 join on +条件的情况下,条件尽量别写到on后

2.Hive里面的left join是怎么执行的?

不考虑where条件下,left join会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null)。

在join阶段。where字句的条件都不会被使用,仅在join阶段完成以后,where子句条件才会被使用,它将从匹配阶段产生的数据中检索过滤。

所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表的数据。

where后面:是先连接生成临时查询结果,然后再筛选on后面:先根据条件过滤筛选,再连接生成临时查询结果。

对于条件在on加个and还是用子查询。查询结果是一模一样的,至于如何使用这个需要分情况,用子查询的话会多一个maptask,但是如果利用这个子查询能过滤很多数据的话,用子查询还是比较建议的,因为不会加载太多的数据到内存中,如果过滤数据不多的情况下,建议用on后面加and条件。

3.Hive内部表,外部表,分区表

.内部表

• 与数据库中的Table在概念上是类似的。

• 每一个Table在Hive中都有一个相应的目录存储数据。

• 所有的Table数据(不包括 External Table)都保存在这个目录中。

• 删除表时,元数据与数据都会被删除。

2.外部表

• 指向已经在HDFS中存在的数据,可以创建Partition。

• 它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。

• 外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据库目录中,只是与外部数据建立一个连接,当删除一个外部表时,仅删除连接和元数据。

3.分区表

• Partition 对应于数据库的Partition列的密集索引。

• 在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值