我想创建一个Hive表,其中输入文本文件遍历到hdfs中的多个子目录.所以我在hdfs中有这样的例子:
/testdata/user/Jan/part-0001
/testdata/user/Feb/part-0001
/testdata/user/Mar/part-0001
and so on...
Run Code Online (Sandbox Code Playgroud)
如果我想在hive中创建一个表用户,但是能够遍历用户的子目录,可以这样做吗?我试过这样的事,但是没有用;
CREATE EXTERNAL TABLE users (id int, name string)
STORED AS TEXTFILE LOCATION '/testdata/user/*'
Run Code Online (Sandbox Code Playgroud)
我认为添加通配符会起作用但不会.当我尝试不使用通配符仍然无法正常工作.但是,如果我将文件复制到用户的根目录,那么它的工作原理.Hive没有办法遍历子目录,并抓住这些文件?
Ruf*_*fus 25
您可以创建外部表,然后将子文件夹添加为分区.
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';
Run Code Online (Sandbox Code Playgroud)
我最终使用如下所示的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"
Run Code Online (Sandbox Code Playgroud)
Hive使用子目录作为数据的分区,因此简单地说:
CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string)
STORED AS TEXTFILE LOCATION '/testdata/user/'
Run Code Online (Sandbox Code Playgroud)
那应该为你做.