Hadoop 配置单元:使用具有多个目录的多个文件创建表

Hadoop 配置单元:使用具有多个目录的多个文件创建表,hadoop,hive,Hadoop,Hive,我想创建一个配置单元表,其中输入文本文件被遍历到hdfs中的多个子目录中。我在hdfs中有一个例子: /testdata/user/Jan/part-0001 /testdata/user/Feb/part-0001 /testdata/user/Mar/part-0001 and so on... 如果我想在配置单元中创建一个表用户,但它能够遍历用户的子目录,那么可以这样做吗?我试过这样的东西,但不起作用 CREATE EXTERNAL TABLE users (id

我想创建一个配置单元表,其中输入文本文件被遍历到hdfs中的多个子目录中。我在hdfs中有一个例子:

    /testdata/user/Jan/part-0001
    /testdata/user/Feb/part-0001
    /testdata/user/Mar/part-0001
and so on...
如果我想在配置单元中创建一个表用户,但它能够遍历用户的子目录,那么可以这样做吗?我试过这样的东西,但不起作用

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/*'  

我以为添加通配符会奏效,但没有。当我尝试不使用通配符时仍然不起作用。但是,如果我将这些文件复制到用户的根目录中,它就会工作。Hive没有办法遍历子目录并获取这些文件吗?

Hive使用子目录作为数据的分区,因此:

CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string)
STORED AS TEXTFILE LOCATION '/testdata/user/'  

您可以创建一个外部表,然后将子文件夹添加为分区

CREATE EXTERNAL TABLE user (id int, name string);
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users;
CREATE EXTERNAL TABLE test (id BIGINT) PARTITIONED BY ( yymmdd STRING);
ALTER TABLE test ADD PARTITION (yymmdd = '20120921') LOCATION 'loc1';
ALTER TABLE test ADD PARTITION (yymmdd = '20120922') LOCATION 'loc2';

最后,我使用了下面这样的shell脚本,用于子目录未知的用例

#!/bin/bash
hive -e "CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) STORED AS TEXTFILE LOCATION '/testdata/user/'; "

hscript=""

for part in `hadoop fs -ls /testdata/user/ | grep -v -P "^Found"|grep -o -P "[a-zA-Z]{3}$"`;
do

echo $part
tmp="ALTER TABLE users ADD PARTITION(month='$part');"
hscript=$hscript$tmp
done;

hive -e "$hscript"

不要将*放在/testdata/user/之后,因为路径配置单元将自动获取所有子目录

如果您想创建分区,那么将HDFS文件夹设置为/testdata/user/year=dynamicyear/month=dynamicmonth/date=dynamicdate

使用分区创建表后,请使用msck修复表tablename

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/'

这不起作用。实际上,我现在应该在CDH3u1上提到。这不起作用。事实上,我应该提到我现在正在运行CDH3u1。定义“不起作用”。我还应该提到,您需要将您的目录名更改为month=Jan等。这是一个非常棒的响应!是的,每次有新的数据目录时(在我的情况下,每天一次),都要更新表。这也是关于Hive如何存储数据的一个很酷的事情。通过以这种方式存储并表示为分区的数据,分区数据将成为一个虚拟列。这意味着,当您以一种将结果限制为日期子集的方式进行查询时(在本例中),Hive只需在几个地方进行搜索,而不必扫描整个数据集以获取您的答案。这应该被选为可接受的答案-它完美地回答了问题。你也帮了我,谢谢你的回答!