Hive:使用具有多个目录的多文件创建表

时间:2012-01-27 20:09:29

标签: hadoop hive

我想创建一个Hive表,其中输入文本文件遍历到hdfs中的多个子目录。所以我在hdfs中有例子:

    /testdata/user/Jan/part-0001
    /testdata/user/Feb/part-0001
    /testdata/user/Mar/part-0001
and so on...

如果我想在hive中创建一个表用户,但是能够遍历用户的子目录,可以这样做吗?我尝试过类似的东西,但不起作用;

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

我认为添加通配符会起作用但不会。当我尝试不使用通配符仍然无法正常工作。但是,如果我将文件复制到用户的根目录,那么它的工作原理。 Hive是否无法遍历子目录,并获取这些文件?

5 个答案:

答案 0 :(得分:21)

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

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';

答案 1 :(得分:7)

我最终使用了如下所示的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"

答案 2 :(得分:5)

Hive使用子目录作为数据的分区,所以简单地说:

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

那应该为你做。

答案 3 :(得分:0)

CREATE EXTERNAL TABLE user (id int, name string);
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users;

答案 4 :(得分:0)

请勿在* / testdata / user /后面加上*,因为路径配置单元将自动获取所有子目录。

如果要进行分区,则将HDFS文件夹设置为/ testdata / user / year = dynamicyear / month = dynamicmonth / date = dynamicdate

在创建具有分区的表之后,请使用msck修复表表名。

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