Hive 面试问题中的分区

2024-01-06

1)如果分区列没有数据,那么当你查询它时,你会得到什么错误?

2)如果某些行没有分区列,这些行将如何处理?会不会有数据丢失?

3)为什么需要对数字列进行分桶?我们也可以使用字符串列吗?流程是什么?您将根据什么选择分桶塔?

4)内表详细信息也会存储在Metastore中吗?或者只存储外部表详细信息?

5)什么类型的查询仅在映射器端运行而不是在减速器中运行,反之亦然?


简短的答案:

1.如果分区列没有数据,那么当你询问时,你会得到什么错误?

Hive 中的分区列是一个名为的文件夹key=value里面有数据文件。如果没有数据,则表示不存在分区文件夹,表为空,不显示错误,不返回数据。 当您使用动态分区在分区列中插入 null 时,分区列中的所有 NULL 值(以及所有不符合字段类型的值)加载为__HIVE_DEFAULT_PARTITION__如果在这种情况下列类型是数字,则在选择期间将引发类型转换错误。例如,无法将 textWritable 转换为 IntWritable

2.如果某些行没有分区列,那么这些行将如何处理?会不会有数据丢失?

如果“没有”表示 NULL,则加载为HIVE_DEFAULT_PARTITION其实还是可以获取到数据的,没有发生丢失的情况

3.为什么需要对数字列进行分桶?- 它不需要是数字我们也可以使用字符串列吗?Yes.流程是什么?您将根据什么选择分桶塔?

应根据连接/过滤列选择用于分桶的列。值被散列、分布式和排序(集群),并且相同的散列被写入(在插入覆盖期间)相同的存储桶(文件)中。桶数和列数在表DDL中指定。

Bucketed table和bucket-map-join是有点过时的概念,您可以使用DISTRIBUTE BY + sort + ORC来实现相同的效果。这种方式比较灵活。

4.内部表详细信息也会存储在元存储中吗?或者只存储外部表详细信息?

与外部或管理无关。表 schema/grants/statistics 存储在元存储中。

5.什么类型的查询仅在映射器端运行而不是在减速器中运行,反之亦然?

没有聚合的查询、映射连接(当小表适合内存时)、简单的列转换(简单的列 UDF,如 regexp_replace、split、substr、trim、concat 等)、WHERE 中的过滤器、排序依据 - 可以在映射器上执行。

聚合和分析、常见连接、排序依据、分发依据、UDAF 在 Mapper+Reducer 上执行。

仅在映射器端运行而不是在减速器中运行,反之亦然

反之亦然是不可能的。 Mapper 用于读取数据文件,reducer 是下一个可选步骤,没有 Mapper 就无法存在,尽管在 Tez 执行引擎上运行时可以进行 map->reduce->reduce... 。 Tez 可以将复杂查询表示为单个 DAG 并作为单个作业运行,并删除 MR 引擎中使用的不必要步骤,例如将中间结果写入 hdfs 并使用映射器再次读取。即使在 MR 地图中,也可以进行仅工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive 面试问题中的分区 的相关文章

随机推荐