Hive - 柱状扫描是否适用于 CSV 外部 Table
Hive - Will columnar scan work on CSV External Table
通常,如果我们使用 parquet 或 ORC 创建一个 Hive table,那么它将扫描我们在 select 查询中提到的特定列。
但是可以说,我有 10 个 CSV 文件并在其上创建了一个外部 table。现在,如果我执行 select col1, col2, col3 from external_table;
那么它会扫描我的所有行并且 reducer 将仅选择 selected 列或者它如何工作?
是的,对于 CSV 或数据存储在面向行的方法中,读取所有行(即和所有列),如果有任何分组依据或聚合,则 reducer 将进行聚合。
简答:映射器逐行读取文件拆分,并将行转换为仅包含必要列的中间行,进行初始过滤、聚合和其他转换。
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 个主要阶段:shuffle、sort 和 reduce。
随机播放
Reducer 的输入是映射器的排序输出。在此阶段,框架通过 HTTP 获取所有映射器输出的相关分区。
排序
在此阶段,框架通过键对 Reducer 输入进行分组(因为不同的映射器可能输出相同的键)。
洗牌和排序阶段同时发生;在获取地图输出时,它们被合并。
在 Reduce 阶段,为分组输入中的每个 <key, (list of values)>
对调用 reduce(WritableComparable, Iterator, OutputCollector, Reporter)
方法。
reduce 任务的输出通常写入文件系统。
如果不需要减少,将减少任务的数量设置为零是合法的。
在这种情况下,映射任务的输出直接进入文件系统。
Tez 上的 Hive 将复杂的作业(由许多 map 和 reduce 步骤组成)构建为单个 DAG(顶点是处理步骤 - 映射器或 reducer,边 - 它们之间的数据传输)并且可以跳过不必要的步骤并且不会写入持久存储 (HDFS) 的中间结果。
阅读 MapReduce 文档中的更多详细信息。
通常,如果我们使用 parquet 或 ORC 创建一个 Hive table,那么它将扫描我们在 select 查询中提到的特定列。
但是可以说,我有 10 个 CSV 文件并在其上创建了一个外部 table。现在,如果我执行 select col1, col2, col3 from external_table;
那么它会扫描我的所有行并且 reducer 将仅选择 selected 列或者它如何工作?
是的,对于 CSV 或数据存储在面向行的方法中,读取所有行(即和所有列),如果有任何分组依据或聚合,则 reducer 将进行聚合。
简答:映射器逐行读取文件拆分,并将行转换为仅包含必要列的中间行,进行初始过滤、聚合和其他转换。
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 个主要阶段:shuffle、sort 和 reduce。 随机播放
Reducer 的输入是映射器的排序输出。在此阶段,框架通过 HTTP 获取所有映射器输出的相关分区。 排序
在此阶段,框架通过键对 Reducer 输入进行分组(因为不同的映射器可能输出相同的键)。
洗牌和排序阶段同时发生;在获取地图输出时,它们被合并。
在 Reduce 阶段,为分组输入中的每个 <key, (list of values)>
对调用 reduce(WritableComparable, Iterator, OutputCollector, Reporter)
方法。
reduce 任务的输出通常写入文件系统。
如果不需要减少,将减少任务的数量设置为零是合法的。 在这种情况下,映射任务的输出直接进入文件系统。
Tez 上的 Hive 将复杂的作业(由许多 map 和 reduce 步骤组成)构建为单个 DAG(顶点是处理步骤 - 映射器或 reducer,边 - 它们之间的数据传输)并且可以跳过不必要的步骤并且不会写入持久存储 (HDFS) 的中间结果。
阅读 MapReduce 文档中的更多详细信息。