
# Hive目的端的作业写入Hive ORC表时，单个字段String数据长度过大，导致写入阻塞或写入后Spark读取失败怎么解决？
#### 问题描述
在将作业写入Hive ORC表时，若单个字段的String数据长度过大，可能导致写入阻塞或写入后Spark读取失败。
图1Spark读取失败   
![](https://support.huaweicloud.com/dataartsstudio_faq/zh-cn_image_0000002683341394.png "点击放大")
#### 原因分析
- 场景一：
  当ORC源码采用字符串字典编码写入STRING数据时，字段编码会使用字节数组缓存数据。若一批数据（默认1000）的总字节大小超过2GB，字节数组缓存将溢出，触发OOM异常，进而导致ORC源码内部出现异常循环。
  
- 场景二：
  当ORC源码采用字符串直接编码写入STRING数据时，字符串数据会直接写入文件。然而，当一批数据（默认1000）中同一字段的字节大小超过2GB时，数据将被写入同一个ORC的Stripe。在Spark读取过程中，用于承载读取数据的字节数组溢出，触发读取异常。
  
 
#### 解决方案
在Hive连接的属性配置中添加参数：
- hive.batch.size=10。 配置ORC Writer写入数据的批大小。通过降低ORC写入批大小用于避免[场景一]的问题。
  
- orc.rows.between.memory.checks=1。 配置ORC在多少条数据后检查数据大小。在ORC每次触发批写入时，如果总的批行数大小超过这个值，会检查总的数据大小用于确定单单次写入的Stripe大小。如果超过Stripe大小（默认64MB），会生成新的Stripe。该配置用于避免[场景二]的问题。配置为1意味着每一批都会检查一次Stripe大小。
  
 
