通常,如果我们使用镶木地板或ORC创建Hive表,则它将扫描在选择查询中提到的特定列。
但是,可以说,我有10个CSV文件,并在其顶部创建了一个外部表。现在,如果我执行select col1, col2, col3 from external_table;
,它将扫描我的所有行,而reducer是否仅选择选定的列或它将如何工作?
答案 0 :(得分:0)
是的,对于CSV或以面向行的方法存储数据的情况,它会读取所有行(即和所有列),如果存在任何分组依据或聚合,那么reducer将进行聚合。
答案 1 :(得分:0)
简短答案::Mapper逐行读取文件拆分,并将行转换为仅具有必要列的中间行,进行初始过滤,聚合和其他转换。
Reducer从mapper接收中间行并进行最终处理:聚合,排序等。
长答案:
MR上的Hive和Tez上的Hive使用MapReduce framework原语来构建整个处理工作。
CSV文件被拆分,MapReduce framework为InputFormat生成的每个InputSplit生成一个映射任务。
映射将输入记录转换为中间记录。转换后的中间记录不必与输入记录具有相同的类型。发出的记录中仅包含必要的列。给定的输入对可能映射到零个或多个输出对,映射器进行初始过滤和聚合。
对Mapper输出进行排序,然后按每个Reducer进行分区,分区的总数与reducer的数量相同。
排序的中间输出始终以简单的(key-len, key, value-len, value)
格式存储。应用程序可以控制是否以及如何压缩中间输出。
Reducer将一组共享密钥的中间值缩减为较小的一组值。换句话说,Reducer将进行最终聚合,并在必要时进行排序。
Reducer具有3个主要阶段:随机播放,排序和缩小。 随机播放
Reducer的输入是映射器的排序输出。在此阶段,框架通过HTTP获取所有映射器的输出的相关分区。 排序
在此阶段,框架通过键将Reducer输入分组(因为不同的映射器可能输出相同的键)。
混洗和排序阶段同时发生;在获取地图输出时,将它们合并。
在Reduce阶段,对分组输入中的每个reduce(WritableComparable, Iterator, OutputCollector, Reporter)
对调用<key, (list of values)>
方法。
reduce任务的输出通常被写入文件系统。
如果不需要减少,则将减少任务的数量设置为零是合法的。 在这种情况下,映射任务的输出直接进入文件系统。
Hive on Tez将单个DAG构建复杂的工作(由许多贴图和缩小步骤组成)(顶点是处理步骤-映射器或缩小器,边线-它们之间的数据传输),并且可以跳过不必要的步骤并且不写入中间结果到持久性存储(HDFS)。
在MapReduce文档中了解更多详细信息。