Hive面试基础

hadoop中两个⼤表实现join的操作

  • Hive中可以通过分区来减少数据量;
  • 通过优化HQL语句,⽐如只查询需要的字段,尽量避免全表、全字段查询;

Hive中存放是什么?

    • 存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的⽂件,HQL就是⽤sql语法来写的mr程序

    Hive与关系型数据库的关系?

    • 没有关系
      • hive是数据仓库,不能和数据库⼀样进⾏实时的CURD操作。 是⼀次写⼊多次读取的操作,可以看成是ETL⼯具。

    Hive中的排序关键字有哪些?

    • sort by:不是全局排序,其在数据进⼊reducer前完成排序
    • order by :会对输⼊做全局排序,因此只有⼀个reducer(多个reducer⽆法保证全局有序).只有⼀个reducer,会导致当输⼊规模较⼤时,需要较⻓的计算时间。
    • distribute by:当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort
    • cluster by:按照指定的字段对数据进⾏划分输出到不同的reduce中

    ⼤表和⼩表join

    • Map side join :
      • 将⼩表存⼊内存中,将⼩表复制多份,让每个map task内存中保留⼀份(⽐如存放到hash table中),这样只需要扫描⼤表。
      • 对于⼤表中的每⼀条记录key/value,在hash table中查找是否有相同的key,如果有,则连接后输出即可。

数据清洗怎么做的?

  • 数据清洗的⽬的是为了保证数据质量,包括数据的完整性、唯⼀性、⼀致性、合法性和权威性。数据清洗的结果是对各种脏数据进⾏对应的处理⽅式,从⽽得到标准的、⼲净的、连续的数据,提供给数据统计和数据挖掘使⽤。

怎么⽤spark做数据清洗?

  • 解决数据的完整性问题:

    • 通过其他信息不全;
    • 通过前后数据不全;
    • 如果实在⽆法不全,虽然可惜,但是还是要剔除掉进⾏统计。但是没必要删除,后续其他分析可能还需要
  • 解决数据的唯⼀性问题:

    • 根据主键进⾏去除,去除重复数据;
    • 制定⼀系列规则,保证根据某种规则下只保存⼀条数据。
  • 解决数据权威性的问题:

    • 选择最权威的数据作为统计和挖掘。
  • 解决合法性的问题:

    • 设定判定规则,通过特定的规则来判断字段或者值来确定数据是否需要被清洗。

    hive优化有哪些?

    • 数据存储及压缩
      • 针对hive中表的存储格式通常有orcparquet,压缩格式⼀般使⽤snappy。相⽐与textfile格式表,orc占有更少的存储。因为hive底层使⽤MR计算架构,数据流是hdfs到磁盘再到hdfs,⽽且会有很多次,所以使⽤orc数据格式和snappy压缩策略可以降低IO读写,还能降低⽹络传输量,这样在⼀定程度上可以节省存储,还能提升hql任务执⾏效率
    • 通过调参优化
      • 并⾏执⾏,调节parallel参数;调节jvm参数,重⽤jvm;设置map、reduce的参数;开启strict mode模式;关闭推测执⾏设置
    • 有效地减⼩数据集
      • 将⼤表拆分成⼦表;结合使⽤外部表和分区表。
    • SQL优化
      • ⼤表对⼤表:尽量减少数据集,可以通过分区表,避免扫描全表或者全字段;
        ⼤表对⼩表:设置⾃动识别⼩表,将⼩表放⼊内存中去执⾏。

分析下hive数据倾斜问题,有什么解决⽅案?

  • 倾斜原因
    • map输出数据按Key Hash分配到reduce中,由于key分布不均匀、或者业务数据本身的特点。等原因造成的reduce上的数据量差异过⼤。
      • key分布不均匀
      • 业务数据本身的特性
      • SQL语句造成数据倾斜
  • 解决⽅案
    • 参数调节
hive.map.aggr=true
hive.groupby.skewindata=true
  • 有数据倾斜的时候进⾏负载均衡,当选项设定为true,⽣成的查询计划会有两个MR Job。
  • 第⼀个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同GroupBy Key有可能被分发到不同的Reduce中,从⽽达到负载均衡的⽬的;
  • 第⼆个MR Job在根据预处理的数据结果按照Group By Key 分布到Reduce中(这个过程可以保证相同的 Group By Key 被分布到同⼀个Reduce中),最后完成最终的聚合操作。
    • SQL语句调节
      • 选⽤join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变⼩的效果。
      • ⼤⼩表Join: 使⽤map join让⼩的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。
      • ⼤表Join⼤表:把空值的Key变成⼀个字符串加上⼀个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。
      • count distinct⼤量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不⽤处理,直接过滤,在做后结果中加1。如果还有其他计算,需要进⾏group by,可以先将值为空的记录单独处理,再和其他计算结果进⾏union

      数据中的null,在hive底层如何存储?

      • null在hive底层默认是⽤"\N"来存储的,所以在sqoop到mysql之前需要将为null的数据加⼯成其他字符,否则sqoop提示错误

      Hive内外部表的区别?

      • 删除表是否影响外部数据 内部表影响,外部表不影响

      hive 是如何实现分区的?

      • 建表语句:
           create table tablename (id) partitioned by (dt string)
      • 增加分区:
           alter table tablenname add partition (dt = ‘2016-03-06’)
      • 删除分区:
           alter table tablename drop partition (dt = ‘2016-03-06’)

请谈⼀下hive的特点是什么?hive和RDBMS有什么异同?

  • hive是基于Hadoop的⼀个数据仓库⼯具,可以将结构化的数据⽂件映射为⼀张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进⾏运⾏。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专⻔的MapReduce应⽤,⼗分适合数据仓库的统计分析
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值