蜂巢面试问题中的分区

partitions in hive interview questions

1) 如果分区列没有数据,那么查询时会出现什么错误?

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

3)为什么要对数值列进行分桶?我们也可以使用字符串列吗?选择分桶列的过程和依据是什么?

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

5) 什么类型的查询只在 mapper 端运行而不在 reducer 端运行,反之亦然?

简答:

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

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

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

如果"does not have"表示为NULL,则加载为HIVE_DEFAULT_PARTITION其实还是可以获取到数据的,没有丢失

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

应根据 joins/filter 列选择分桶列。值被散列、分布和排序(聚集),并且相同的散列被写入(在插入覆盖期间)在相同的桶(文件)中。桶数和列数在 table DDL 中指定。

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

4. 内部 table 细节是否也会存储在 Metastore 中?或者只存储外部 table 详细信息?

外部或托管无关紧要。 Table schema/grants/statistics 存储在 Metastore 中。

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

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

聚合和分析、常见连接、排序方式、分发方式、UDAF 在 mapper+reducer 上执行。

runs only at mapper side not in reducer and vice versa

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