Hive 蜂巢面试问题中的划分

Hive 蜂巢面试问题中的划分,hive,mapreduce,hiveql,hive-partitions,Hive,Mapreduce,Hiveql,Hive Partitions,1) 如果分区列没有数据,那么当您查询该列时,会出现什么错误 2) 如果某些行没有分区列,那么将如何处理这些行?会有数据丢失吗 3) 为什么需要使用数字列进行bucketing?我们也可以使用字符串列吗?该过程是什么?您将在什么基础上选择bucketing柱 4) 内部表详细信息是否也将存储在metastore中?还是只存储外部表的详细信息 5) 哪种类型的查询只在映射器端运行,而不在reducer端运行,反之亦然?简短回答: 1.如果分区列没有数据,那么当您查询该列时,会出现什么错误 配置单元

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

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

3) 为什么需要使用数字列进行bucketing?我们也可以使用字符串列吗?该过程是什么?您将在什么基础上选择bucketing柱

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

5) 哪种类型的查询只在映射器端运行,而不在reducer端运行,反之亦然?

简短回答:

1.如果分区列没有数据,那么当您查询该列时,会出现什么错误

配置单元中的分区列是一个名为
key=value
的文件夹,其中包含数据文件。如果没有数据,则表示不存在分区文件夹,并且表为空,不显示错误,也不返回数据。 当您使用动态分区在分区列中插入null时,分区列中的所有null值(以及所有不符合字段类型的值)将加载为
\uuuuuuu HIVE\u DEFAULT\u PARTITION\uuuuu
,如果在这种情况下列类型为数字,则在选择期间将抛出类型转换错误。例如,无法将textWritable强制转换为IntWritable

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

如果“nothave”表示为空,则加载为配置单元默认分区实际上仍然可以获取数据,没有发生丢失

3.为什么需要使用数字列进行扣压-它不需要是数字我们也可以使用字符串列吗是。选择bucketing列的过程和依据是什么

应根据连接/过滤柱选择用于扣合的柱。正在对值进行散列、分发和排序(群集),并在相同的存储桶(文件)中写入相同的散列(在插入覆盖期间)。桶和列的数量在表DDL中指定

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

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

不管是外部的还是管理的。表schema/grants/statistics存储在元存储中

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

无聚合的查询、映射联接(当小表适合内存时)、简单列转换(简单列UDF,如regexp_replace、split、substr、trim、concat等)、WHERE中的过滤器、sort by-可以在mapper上执行


聚合和分析、常见连接、订购方式、分发方式、UDAFs都在mapper+reducer上执行。

非常感谢您的回答。还有一个内部表将存储在/usr/hive/warehouse中。但是外部表不是持久的。或者它会存储在任何地方吗?@Anonymous Only临时表不是持久的。外部和托管的数据都在分布式文件系统中。元数据-在元存储中。读一下:@Anonymous,当然读一下:-用解释进行测试。你的意思是说,当创建托管表时,它将存储在/user/hive/warehouse/database_name.db/managed_table_name中。当创建外部表时,它也将存储在相同的位置/user/hive/warehouse/database\u name\u external.db/external\u table\u name。@vikrantrana回答。bucket是文件。根据数据大小动态创建文件更好(在查询中使用distribute by+每个减速机的字节数)