蜂巢面试问题中的分区
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 地图中,只有工作是可能的。
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 地图中,只有工作是可能的。