hive相关综合知识点汇总

一、视图:

视图中保留有原表的元数据信息,但是不会保留数据,当我们查询视图的数据的时候,可以查到,但是当我们查询真正数据的时候,这是后才会去执行建立视图的时候的SQL语句。例如:

表A为

执行建立视图语句:create view A_view as select * from A where dt = 2020/6/13

那么当我们执行desc A_view的时候,会看到id,name这两列,当我们去执行select * from A_view 的时候,才会真正去执行select * from A where dt = 2020/6/13。但是,此时我们在A中加入一个age字段后,不去执行建立视图语句,继续沿用之前的,那么执行desc的时候会发现还是只有id和name两列(因为视图会保留元数据,所以表结构是直接用的原来视图存下来的),如果我们去执行select * from A_view 这时候会发现有三列数据,因为这个时候再去查询视图,实际去执行了select * from A where dt = 2020/6/13,所以会有全部字段和数据。

二、hive1.X(1.2.1为例)和hive2.X(2.3.5为例)的SQL兼容

1.隐式转换:如果两张表需要union、union all,那么这样个表中的字段类型必须一致,如果字段类型在同一组里,那么可以自动转换,如果不同组,则需要强制转换,否则报错

2.随着版本的变迁,保留字越来越多,如果用到了必须加上反引号

3.hive的参数配置问题,如果参数的大小写不对,则会直接报错

4.建表的时候不指定列的具体类型,会直接报错。例如:

create table table1 as select id,name from table2;不可以是create table table1 as select * from table2

5.hint的方式不支持了,所以之前的/* +MAPJOIN(gs)*/类似这样的mapjoin方式的优化要去掉,不然会报空指针异常,用set hive.auto.convert.join=true;代替,更为智能

6.SET hive.hadoop.supports.splittable.combineinputformat=true;set hive.ptf.partition.persistence.memsize=671088640;set hive.support.sql11.reserved.keywords=false;不支持了

7.反射udf默认在黑名单里,不可用,有安全风险

三、join在MR中处于哪个过程

1.这里需要注意明确的一点:join只是一个连接的过程

2.如果是join,如select * from A join B。

①如果AB都是大表,则会发生reduce阶段,在map阶段会将两个表的key拿出来排序,然后在reduce中将两列key进行关联(也就是join),最终从对应的表里取出字段。如果是count(*) 有group by,那么就会再接一个MR,然后进入第二个MR,在第二个MR的reduce中进行聚合汇总

②如果AB表有一个是小表(小于64M),那么就会将小表加载到内存里,然后将大表的key拿出来,去到内存中和小表的key进行关联(join),此时join是发生在map中的,且没有reduce阶段。如果是count(*) 有group by,那么就会再接一个MR,然后进入第二个MR,在第二个MR的reduce中进行聚合汇总

3.如果是left join ,如select * from A left join B。

①如果A是小表,会自动加载到内存里,进行mapjoin,这也是为什么hive建议小表在左,大表在右的原则

②如果都是大表,则遵循2-①原则,或者可以手动开启mapjoin(sql中加入/*+mapjoin(小表)*/),

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值