Hive:从多级目录加载数据

Posted

技术标签:

【中文标题】Hive:从多级目录加载数据【英文标题】:Hive : Load data from Multi-level directory 【发布时间】:2016-09-23 08:52:20 【问题描述】:

我想将多级目录中的数据加载到我的配置单元表中。但错误是:

hive> LOAD DATA INPATH 'hdfs://hadoop1:9000/logClassify/unLock' INTO
 TABLE unLock;

失败:SemanticException Line 1:17 路径无效 ''hdfs://hadoop1:9000/logClassify/unLock'':源包含目录: hdfs://hadoop1:9000/logClassify/unLock/2016

我已经在 hive-site.xml 文件中设置了参数:

<property>
     <name>mapred.input.dir.recursive</name>
     <value>true</value> 
</property>

<property>
    <name>hive.mapred.supports.subdirectories</name>
    <value>true</value>   
</property>

不知道为什么?

【问题讨论】:

您的 hdfs://hadoop1:9000/logClassify/unLock 目录中似乎有年度数据。更好地使用 hive 分区并创建分区列年份。 【参考方案1】:

如果你想从本地存储中获取数据

LOAD DATA LOCAL INPATH '/home/data' INTO TABLE table_name;

如果你想从 hdfs 中获取数据,只需删除 LOCAL

LOAD DATA LOCAL INPATH '/user/data' INTO TABLE table_name;

【讨论】:

无需在路径中添加主机名 (hdfs://hadoop1:9000) 并且您的上述错误“源包含目录:hdfs://hadoop1:9000/logClassify/unLock/2016”表示此位置包含目录,因此请为其提供文件的正确目标路径。跨度> 我要递归子目录,因为不同子目录下的文件很多。 因此您必须提供该子目录路径,因为这里 hive 无法找到您要加载的正确文件。【参考方案2】:

试试这个:

在 Hive 命令行界面输入:

设置 hive.input.dir.recursive=true;

设置 hive.mapred.supports.subdirectories=true;

设置 hive.supports.subdirectories=true;

之后,加载数据。例如,如果您有一级目录:

LOAD DATA INPATH "/data/testdata/" INTO TABLE testtable;*

对于两级目录:

LOAD DATA INPATH '/data/testdata/ /' INTO TABLE 测试表;

希望这会有所帮助。

【讨论】:

【参考方案3】:

试试这个:

在 Hive 命令行界面输入:

set hive.input.dir.recursive=true;
set hive.mapred.supports.subdirectories=true;
set hive.supports.subdirectories=true;

之后,加载数据。例如,如果您有一级目录:

LOAD DATA INPATH "/data/testdata/*" INTO TABLE testtable;

对于两级目录:

LOAD DATA INPATH '/data/testdata/* /*' INTO TABLE testtable;

希望这会有所帮助。

【讨论】:

以上是关于Hive:从多级目录加载数据的主要内容,如果未能解决你的问题,请参考以下文章

hive数据加载

Spark抽取mysql中的数据到Hive中

Spark抽取mysql中的数据到Hive中

Spark抽取mysql中的数据到Hive中

Spark抽取mysql中的数据到Hive中

查询所有HIVE表分区数据量