
# 通过spark-shell加载数据到Hive表失败
#### 用户问题
使用spark-shell命令执行SQL或者spark-submit提交的Spark任务里面有SQL的load命令，并且原数据和目标表存储位置不是同一套文件系统，上述两种方式MapReduce任务启动时会报错。
#### 原因分析
当使用load导入数据到Hive表的时候，属于需要跨文件系统的情况（例如原数据在HDFS上，而Hive表数据存放在OBS上），并且文件长度大于阈值（默认32 MB），则会触发使用distcp的MapReduce任务来执行数据迁移操作。这个MapReduce任务配置直接从Spark任务配置里面提取，但是Spark任务的net.topology.node.switch.mapping.impl配置项不是hadoop的默认值，需要使用Spark的jar包，因此MapReduce会报类找不到。
#### 处理步骤
方案一：
如果文件较小，则可以将默认长度设置得大于文件最大长度，例如最大的文件是95 MB，则设置：
```
hive.exec.copyfile.maxsize=104857600
```
方案二：
如果确实文件较大，需要使用distcp任务来提高数据迁移效率，则可以在Spark任务启动的时候增加设置参数：
```
--conf spark.hadoop.net.topology.node.switch.mapping.impl=org.apache.hadoop.net.ScriptBasedMapping
```
