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

use*_*794 15 hadoop hive

我想创建一个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)


Dha*_*esh 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"
Run Code Online (Sandbox Code Playgroud)


Ste*_*nce 5

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)

那应该为你做.

  • 定义"没有工作".我还要提一下,您需要将目录名更改为month = Jan等... (3认同)