hive - hive 面试问题中的分区

标签 hive mapreduce hiveql mapper hive-partitions

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

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

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

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

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

最佳答案

简短的答案:
1. 如果分区列没有数据,那么 当你查询 ,你会得到什么错误?
Hive 中的分区列是一个名为 key=value 的文件夹里面有数据文件。如果没有数据,则表示不存在分区文件夹且表为空,不显示错误,不返回数据。
当您使用动态分区在分区列中插入 null 时,分区列中的所有 NULL 值(以及所有不符合字段类型的值)加载为 __HIVE_DEFAULT_PARTITION__如果在这种情况下列类型是数字,则在选择期间将引发类型转换错误。例如,不能将 textWritable 转换为 IntWritable 之类的东西
2. 如果某些行没有分区列,将如何处理这些行?会不会有数据丢失?
如果“没有”表示 NULL,则加载为 HIVE_DEFAULT_PARTITION 其实还是可以取到数据的,没有丢失
3. 为什么需要对数字列进行分桶? -它不需要是数字我们也可以使用字符串列吗? 是的。 流程是什么,您将在什么基础上选择分桶列。?
应根据连接/过滤列选择用于分桶的列。值正在被散列、分布和排序(集群),并且相同的散列被写入(在插入覆盖期间)相同的存储桶(文件)中。桶和列的数量在表 DDL 中指定。
Bucketed table 和 bucket-map-join 是一个有点过时的概念,你可以使用 DISTRIBUTE BY + sort + ORC 来实现。这种方法更灵活。
4. 内部表的详细信息也会存储在元存储中吗?还是只存储外部表的详细信息?
外部或管理无关紧要。表 schema/grants/statistics 存储在 Metastore 中。
5. 什么类型的查询,只在映射器端而不在 reducer 中运行,反之亦然?
没有聚合的查询、map-joins(当小表适合内存时)、简单的列转换(简单的列 UDF,如 regexp_replace、split、substr、trim、concat 等)、WHERE 中的过滤器、排序方式 - 可以在 mapper 上执行。
聚合和分析、公共(public)连接、排序依据、分发依据、UDAF 在 mapper+reducer 上执行。

runs only at mapper side not in reducer and vice versa


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

关于hive - hive 面试问题中的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55633122/

相关文章:

hadoop - 如何用hadoop实现自连接/叉积?

hadoop - 如果 INSERT OVERWRITE 的 SELECT 查询不返回任何结果,是否有办法防止 Hive 表被覆盖

mysql - 根据条件加入

hadoop - 将配置单元分区表加载到Spark Dataframe

java - 读/写时出错(Hadoop)

sql-server - 设置ODBC Hortonworks后在SQL中添加HIVE链接服务器

python - hadoop 中的拆分和映射任务数

hadoop - 如何确定执行配置单元查询所需的作业总数

sql - 需要在hadoop配置单元中的两个两个已知字符之间选择一个字符串

mysql - Hive 查询问题 - 无效的表别名或列引用