当文件不在目录中时,从HDFS加载文件到Hive的替代方法
解决Hive加载HDFS非目录文件的替代方法
遇到你描述的这种情况——HDFS中${database_location}/Person是单个part-m文件而非目录,导致原建表语句无法正常加载数据,这里有几个可行的替代方案:
1. 将文件移动到对应目录(最直接的标准做法)
Hive的LOCATION参数预期指向存储数据的目录而非单个文件,所以我们可以先在HDFS中创建对应目录,再把目标文件移进去:
首先执行HDFS命令:
# 创建Person目录 hdfs dfs -mkdir -p ${database_location}/Person # 把原Person文件移动到新建的目录下 hdfs dfs -mv ${database_location}/Person ${database_location}/Person/
之后再执行你原本的建表语句,此时LOCATION '${database_location}/Person'指向的就是包含数据文件的合法目录,Hive就能正常识别并加载数据了。
2. 先建表再加载文件到Hive表
如果不想修改HDFS上的文件结构,可以先创建不带LOCATION的表,再用LOAD DATA命令把目标文件加载到表的默认存储目录:
首先创建表(补充好你的字段定义):
CREATE TABLE Person ( -- 替换为你的实际字段,例如: id INT, name STRING, age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '${database_delimiter}' LINES TERMINATED BY '\n' STORED AS TEXTFILE;
然后执行加载命令:
LOAD DATA INPATH '${database_location}/Person' INTO TABLE Person;
这个命令会自动把HDFS上的Person文件移动到该Hive表对应的默认存储目录中,之后你就可以正常查询表数据了。
3. 直接指向文件所在的父目录(仅适用于目录下无其他无关文件)
如果目标文件所在的父目录(即${database_location})中没有其他无关数据文件,可以修改建表语句的LOCATION指向这个父目录:
CREATE EXTERNAL TABLE Person ( -- 替换为你的实际字段定义 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '${database_delimiter}' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '${database_location}';
注意:这种方式会加载该目录下的所有文件作为表数据,如果目录里有其他无关文件,会导致数据混乱,所以仅适合目录下只有目标Person文件的场景。
内容的提问来源于stack exchange,提问作者Peaches
相关产品推荐
相关产品推荐

