
# 配置矢量化读取ORC数据
#### 配置场景
ORC文件格式是一种Hadoop生态圈中的列式存储格式，它最初产生自Apache Hive，用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet文件格式类似，它并不是一个单纯的列式存储格式，仍然是首先根据行组分割整个表，在每一个行组内按列进行存储，并且文件中的数据尽可能的压缩来降低存储空间的消耗。矢量化读取ORC格式的数据能够大幅提升ORC数据读取性能。在Spark2.3版本中，SparkSQL支持矢量化读取ORC数据（这个特性在Hive的历史版本中已经得到支持）。矢量化读取ORC格式的数据能够获得比传统读取方式数倍的性能提升。
该特性可以通过下面的配置项开启：
- "spark.sql.orc.enableVectorizedReader"：指定是否支持矢量化方式读取ORC格式的数据，默认为true。
- "spark.sql.codegen.wholeStage"：指定是否需要将多个操作的所有stage编译为一个java方法，默认为true。
- "spark.sql.codegen.maxFields"：指定codegen的所有stage所支持的最大字段数（包括嵌套字段），默认为100。
- "spark.sql.orc.impl"：指定使用Hive还是Spark SQL native作为SQL执行引擎来读取ORC数据，默认为hive。
 
#### 配置参数
登录FusionInsight Manager系统，选择"集群 \> *待操作集群的名称* \> 服务 \> Spark2x \> 配置"，单击"全部配置"，搜索以下参数。
| **参数**                               | **说明**                                               | **默认值** | 取值范围            |
|:---|:---|:---|:---|
| spark.sql.orc.enableVectorizedReader | 指定是否支持矢量化方式读取ORC格式的数据，默认为true。                       | true    | \[true,false\]  |
| spark.sql.codegen.wholeStage         | 指定是否需要将多个操作的所有stage编译为一个java方法，默认为true。              | true    | \[true,false\]  |
| spark.sql.codegen.maxFields          | 指定codegen的所有stage所支持的最大字段数（包括嵌套字段），默认为100.           | 100     | 大于0             |
| spark.sql.orc.impl                   | 指定使用Hive还是Spark SQL native作为SQL执行引擎来读取ORC数据，默认为hive。 | hive    | \[hive,native\] |
   
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
1. 使用SparkSQL内置的矢量化方式读取ORC数据需要满足下面的条件：
   - spark.sql.orc.enableVectorizedReader : true，默认是true，一般不做修改。
   
   - spark.sql.codegen.wholeStage : true，默认为true，一般不做修改。
   
   - spark.sql.codegen.maxFields不小于scheme的列数。
   
   - 所有的数据类型均为AtomicType类型；所谓Atomic Type表示非NULL、UDTs、arrays，maps类型。如果列中存在这几种类型的任意一种，都无法获得预期的性能。
   
   - spark.sql.orc.impl : native ,默认为hive。
    
2. 若使用客户端提交任务，"spark.sql.orc.enableVectorizedReader"、"spark.sql.codegen.wholeStage"、"spark.sql.codegen.maxFields"、"spark.sql.orc.impl"、参数修改后需要重新下载客户端才能生效。
 
