蜂巢面试问题中的分区

时间:2019-04-11 13:00:18

标签: hive hive-partitions

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

简短答案:

1。。如果分区列中没有数据,那么当您对此进行查询时,会遇到什么错误?

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

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

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

3。。为什么需要对数字列进行存储? -不需要数字,我们也可以使用字符串列吗? 是的。是什么过程,您将在什么基础上选择时段列?

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

桶表和桶映射联接是一个有点过时的概念,您可以使用DISTRIBUTE BY + sort + ORC来实现相同的目的。这种方法更加灵活。

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

无关紧要,不受外部管理。表架构/拨款/统计信息存储在metastore中。

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

无聚集查询,map-joins(当小表适合内存时),简单列转换(如regexp_replace,split,substr,trim,concat等简单列UDF),WHERE中的过滤器,按-可以执行在映射器上。

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