蜂巢面试问题中的分区

Ano*_*ous 3 hive hive-partitions

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

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

3)为什么需要对数字列进行存储?我们也可以使用字符串列吗?您将选择什么处理程序以及在什么基础上选择分类列?

4)内部表详细信息也将存储在metastore中吗?还是只存储外部表的详细信息?

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

lef*_*oin 6

简短的答案:

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

Hive中的分区列是一个文件夹,key=value其中包含数据文件。如果没有数据,则意味着不存在分区文件夹并且表为空,不显示错误,不返回任何数据。当您使用动态分区分区列内(不符合字段类型和所有值)加载所有NULL值在分区列中插入空__HIVE_DEFAULT_PARTITION__如果列类型是在这种情况下,则类型转换错误会期间抛出的数字选择。例如,无法将textWritable转换为IntWritable之类的东西

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

如果“没有”表示为NULL,则将其加载为HIVE_DEFAULT_PARTITION实际上仍然可以获取数据,没有丢失

3.为什么需要对数字列进行存储?-它不需要是数字,我们也可以使用字符串列吗?是。您将选择什么处理程序以及在什么基础上选择分类列?

应根据联接/过滤器列选择用于存储区的列。值被散列,分布和排序(聚簇),并且相同的哈希值(在插入覆盖期间)被写入相同的存储桶(文件)中。表DDL中指定了存储区和列的数量。

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

4.内部表详细信息也将存储在metastore中吗?还是只存储外部表的详细信息?

无关紧要外部或托管。表架构/许可/统计信息存储在metastore中。

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

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

聚合和分析,通用联接,UDAF的排序,分发是在mapper + reducer上执行的。