我想创建一个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是否无法遍历子目录,并获取这些文件?
答案 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/'