
在Spark或MR引擎中插入的数据,在Hive表中的查询结果为0
5星
- 浏览量: 0
- 大小:None
- 文件类型:DOC
简介:
当在Apache Spark或MapReduce引擎中处理并存储数据至Hive表后遇到查询结果显示为空的情况时,本文将提供排查此类问题的方法和建议。
### Spark或MR引擎插入的数据在Hive表查询为0的问题解析
#### 问题背景与现象
大数据处理场景下,经常使用不同的执行引擎(如Spark、MapReduce (MR) 或 Tez)进行数据操作。常见的问题是:当通过Spark或MR引擎向Hive表中写入数据后,用Hive查询这些表时发现没有返回任何记录。具体表现为用户报告在Tez引擎环境下可以正常获取到正确结果,但在使用Spark-SQL查询同一张表时却无法读取到任何数据。
#### 原因分析
该问题的根本原因在于执行写入操作的引擎(如Tez)在处理`UNION ALL`指令时会在原始分区目录下生成一个额外子目录,例如`HIVE_UNION_SUBDIR_1`(或类似的命名)。当使用这种机制进行数据合并后,并没有直接将结果存储到对应的主分区中,而是放在了这个新创建的子目录内。如果查询使用的引擎未正确配置处理这种情况,则会导致无法读取实际写入的数据。
#### 解决方案
为解决上述问题,可以从调整数据插入方式和优化查询时的设置两个方面入手:
##### 方案一:改变数据写入策略
1. **更换执行引擎**:最直接的方法是避免使用Tez进行`UNION ALL`操作。可以改用Hive或Spark-SQL作为主要的数据写入工具,这样能确保数据直接存储在指定的分区目录中。
2. **利用二次处理方法**:
- 在通过Tez完成合并后,可以通过表插入的方式将分散于子目录中的数据重新组织到主分区文件夹内。
- 另一种选择是在执行`UNION ALL`操作时添加`DISTRIBUTE BY`指令来强制启动一次Reduce过程,这有助于整理和优化数据分布。
##### 方案二:调整查询引擎配置
1. **MapReduce(MR)的设置**:
设置以下参数以支持子目录读取:
```
set hive.mapred.supports.subdirectories=true;
set mapred.input.dir.recursive=true;
```
2. **Spark-SQL的设置**:
同样需要如下配置来确保数据被正确识别和读取:
```
--conf spark.sql.hive.convertMetastoreOrc=false
--conf spark.hadoop.mapred.input.dir.recursive=true
```
#### 结论
通过对上述分析可以了解到,当使用Spark或MR引擎插入的数据在Hive表查询时显示为0条记录的问题主要是由于Tez执行`UNION ALL`操作后产生的子目录问题。通过改变数据写入策略或者优化查询配置都可以有效地解决此问题,在实际应用中可以根据具体情况选择最合适的解决方案以确保数据的准确读取和处理。
全部评论 (0)


