Hive 常见问题

Hive 内部表和外部表的区别

  • 外部表在创建时需要加关键字 external;
  • 创建内部表时,会将数据移动到数据仓库指定的路径;
  • 创建外部表时,不会移动数据,只会记录数据所在的路径;
  • 删除内部表时,会删除元数据和数据本身;
  • 删除外部表时,仅仅删除元数据,不会删除数据本身;

Hive cluster by、sort by、distribute by、order by 的区别

  • order by :全局排序,只有一个 reduce ,数据量很大时会比较慢;
  • sort by :局部排序,只保证每个 reduce 中的数据有序,不能保证全局有序;
  • distribute by :控制 map 结果分发,相同值会被分发到同一个 map ;
  • cluster by :根据指定字段将数据分组,每组内再根据该字段正序排序(只能正序),cluster by = distribute by + sort by;

Hive 分区和分桶的区别

  • 分区是将 Hive 表数据分离为多个目录;
  • 分桶是将对应的数据文件分解为若干个部分;
  • 分区的字段必须是表中没有的字段;
  • 分桶的字段必须是表中已经存在的字段;

Hive Union 和 Union all 的区别

  • union :将多个结果合并为一个,对结果去重并排序;
  • union all :将多个结果合并为一个,不对结果去重不排序;

Hive join 的原理

在 Map 阶段将 on 的字段设为 key ,然后将选择的字段作为 value 在 Reduce 阶段,相同 key 值的数据分发到同一个 Reducer;

Hive 如何优化 join 操作

  • 若有大量 null key ,则先过滤或者随机赋值;
  • 所是大小表 join ,可使用 MapJoin ;
  • 若两张大表 join,可将倾斜的 key 过滤出来单独 join,则会分不到多个 task 进行 join 操作,最后在进行 union 操作;

Hive 的三种自定义函数及区别

  • UDF :用户自定义函数,一对一输出,例如 round;
  • UDTF :用户自定义表生产函数,一对多输出,例如 explode;
  • UDAF :用户自定义聚合函数,多对一输出,例如count,sum 等;

Hive 数据倾斜

什么是数据倾斜?

  • 数据倾斜是指在分布式处理中,数据不均匀,有部分数据比较集中;
  • 数据倾斜会使得在处理过程中,某个结点的处理效率过低,甚至造成内存溢出;

造成数据倾斜的原因

  • 业务本身造成的;
  • 建表时考虑不周,导致 key 分布不均匀;
  • 某些 SQL 操作容易造成数据倾斜;

造成数据倾斜的主要操作

group by
维度过少,某些值比较大,分发到不同 Reduce 操作,造成某个 Reduce 数据倾斜;

join
某些 key 值比较多,或者 key 值存在大量 null ,join 后分发到某个 Reduce 的数据量过大;

数据倾斜的解决方法

group by 造成的数据倾斜

分组中有部分数据比较多,造成数据倾斜。这种情况可以通过调参解决:

set hive.map.aggr=true;
set hive.groupby.skewindata=true;
  • hive.map.aggr=true 表示开启 map 端聚合;
  • hive.groupby.skewindata=true 表示有数据倾斜时进行负载均衡,这会使得生成两个 MR job,第一个 job 会将数据随机分发到不同的 Reduce 进行聚合,可以达到负载均衡的效果;结果传入第二个 MR job ,根据预处理的数据结果按照 group by key 进行分发处理,包获赠相同的 key 分到同一个 Reduce 中,完成聚合;

join 造成的数据倾斜

有大量 null 值 join 的情况

  • 数据中有大量 null 值,可以过滤掉;
  • 使用随机值赋值;

大小表 join 的情况

  • 可以使用 map join 将小表加载到内存中,并在 map 阶段完成 join 操作;
    例如:
 select /*+MAPJOIN(b)*/ a.a1,a.a2,b.b2 from tablea a JOIN tableb b ON a.a1=b.b1  --其中b 为小表

key 值倾斜的情况
可以将倾斜的 key 过滤出来单独 join ,则会分散到多个 task 进行 join’ 操作,最后再进行 union 即可;

相关推荐

  1. Hive 常见问题

    2024-07-16 16:16:03       17 阅读
  2. hive问题记录

    2024-07-16 16:16:03       60 阅读
  3. Hive面试问题

    2024-07-16 16:16:03       26 阅读
  4. hive 常见存储格式和应用场景

    2024-07-16 16:16:03       55 阅读
  5. Git篇常见问题

    2024-07-16 16:16:03       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 16:16:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 16:16:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 16:16:03       58 阅读
  4. Python语言-面向对象

    2024-07-16 16:16:03       69 阅读

热门阅读

  1. Docker_指令篇

    2024-07-16 16:16:03       21 阅读
  2. 【利用Selenium+autoIt实现文件上传】

    2024-07-16 16:16:03       20 阅读
  3. 专升本(英语)1.0.2-july 15th 升本:210天

    2024-07-16 16:16:03       16 阅读
  4. day30【LeetCode力扣】18.四数之和

    2024-07-16 16:16:03       19 阅读
  5. 力扣 hot100 -- 技巧

    2024-07-16 16:16:03       21 阅读
  6. 【webpack开发环境下的配置】

    2024-07-16 16:16:03       21 阅读
  7. Win7电脑修改网卡配置连接千兆网络的方法

    2024-07-16 16:16:03       22 阅读
  8. 发布自动化:Gradle发布插件的配置全攻略

    2024-07-16 16:16:03       20 阅读
  9. MySQL中为什么要使用索引合并(Index Merge)

    2024-07-16 16:16:03       23 阅读