Hive 常见问题

1. Hive 与 mySQL 的 区别

2. Hive 的版本选择问题

3. sort/distribute/cluster by

  • order by 全局排序,大规模数据集效率低
  • Sort by为每个reducer产生一个排序文件。每个Reducer内部进行排序,对全局结果集来说不是排序
  • distribute by 在有些情况下,我们需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中partition(自定义分区),进行分区,结合sort by使用。 对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。
  • cluster by 当 distribute by 和 sort by 字段相同时,可以使用cluster by方式。cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定ASC或者DESC。

4. 分区/分桶

  • 二级分区、动态分区、静态分区、非严格模式
  • 分桶:分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。分桶是将数据集分解成更容易管理的若干部分的另一个技术。分区针对的是数据的存储路径;分桶针对的是数据文件。
  • 分桶规则:根据结果可知:Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中

5. 行专列

  • concat(string a, string b)
  • concat_ws(separator, str1, str2)
  • collect_set(col 去重)
  • collect_list(col) 不去重

6. 列转行

  • split(str, separator) 将字符串按照后面的分隔符切割,转换成字符array;
  • explode(col) 将hive一列中复杂的array或者map结构拆分成多行;
  • lateral view 用法:lateral udtf(expression) tableAlias AS columnAlias
    解释:lateral view用于和split, explode等UDTF一起使用。
    将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
    lateral view 首先为原始表的每行调用 UDTF,UDTF 会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表,虚拟表为被炸裂的字段形成的单列表,然后与原表中同行字段进行 join。

7. 自定义函数

  • 实现步骤:
    GenericUDF/UDTF ->
    实现抽象方法 ->
    添加 jar ->
    hive 命令创建函数

8. 文件存储格式

  • 行式存储:
    查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询整行数据的速度更快。textfile 和 sequencefile 的存储格式都是基于行存储的。
  • 列式存储:
    因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的。列式存储可以针对性的设计更好的设计压缩算法。ORC 和 PARQUET 是基于列式存储的。
  • ORC
    image-20210804233844578
    1. 每个Orc文件由1个或多个stripe组成,每个stripe一般为HDFS的块大小,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group的概念。每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer
    2. Index Data:一个轻量级的index,默认是每隔1W行做一个索引。这里做的索引应该只是记录某行的各字段在Row Data中的offset。
    3. Row Data:存的是具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个Stream来存储。
    4. Stripe Footer:存的是各个Stream的类型,长度等信息。
    5. 每个文件有一个File Footer,这里面存的是每个Stripe的行数,每个Column的数据类型信息等;
    6. 每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以及FileFooter的长度信息等。在读取文件时,会seek到文件尾部读PostScript,从里面解析到File Footer长度,再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。
  • Parquet
    image-20210804234015486
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值