配置单元 - 列式扫描是否适用于 CSV 外部表



通常,如果我们创建一个带有镶木地板或ORC的Hive表,那么它将扫描我们在选择查询中提到的特定列。

但是,假设我有 10 个 CSV 文件,并在它上面创建了一个外部表。现在,如果我这样做select col1, col2, col3 from external_table;那么它会扫描我的所有行,并且 reducer 只会选择选定的列或它将如何工作?

简短回答:映射器逐行读取文件拆分,并将行转换为仅包含必要列的中间行,进行初始过滤、聚合和其他转换。

Reducer 从映射器接收中间行并进行最终处理:聚合、排序等。

长答案:

Hive on MR和Hive on Tez使用MapReduce框架原语来构建整个处理作业。

CSV文件正在被拆分,MapReduce框架为InputFormat生成的每个InputSplit生成一个映射任务。

地图将输入记录转换为中间记录。转换后的中间记录不需要与输入记录的类型相同。发出的记录中仅包含必要的列。给定的输入对可以映射到零个或多个输出对,映射器执行初始过滤和聚合。

映射器输出按化简器进行排序,然后按化简器进行分区,分区总数与化简器数相同。

中间、排序的输出始终以简单的(key-len, key, value-len, value)格式存储。应用程序可以控制是否以及如何压缩中间输出。

Reducer 将共享一个键的一组中间值减少为一组较小的值。换句话说,Reducer 执行最终聚合,必要时进行排序。

化简器有3个主要阶段:洗牌,排序和化简。 洗牌

化简器的输入是映射器的排序输出。在此阶段,框架通过 HTTP 获取所有映射器输出的相关分区。 排序

在此阶段,框架按键对 Reducer 输入进行分组(因为不同的映射器可能输出相同的键)。

随机和排序阶段同时发生;当获取映射输出时,它们被合并。

在Reduce阶段,对分组输入中的每个<key, (list of values)>对调用reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。

归约任务的输出通常写入文件系统。

如果不需要减少,将减少任务的数量设置为零是合法的。 在这种情况下,映射任务的输出直接发送到文件系统。

Tez上的Hive 将复杂的作业(由许多映射和reduce步骤组成)构建为单个DAG(顶点是处理步骤 - 映射器或化简器,边缘 - 它们之间的数据传输),并且可以跳过不必要的步骤,并且不会将中间结果写入持久存储(HDFS)。

在MapReduce文档中阅读更多详细信息。

是的,对于CSV或数据存储在面向行的方法中读取所有行(即和所有列),如果有任何分组或聚合,则reducer将进行聚合。

相关内容

最新更新