从分区文件结构创建Impala外部表

时间:2013-08-07 16:42:41

标签: hadoop bigdata cloudera impala

提供了如下的分区fs结构:

logs
└── log_type
    └── 2013
        ├── 07
        │   ├── 28
        │   │   ├── host1
        │   │   │   └── log_file_1.csv
        │   │   └── host2
        │   │       ├── log_file_1.csv
        │   │       └── log_file_2.csv
        │   └── 29
        │       ├── host1
        │       │   └── log_file_1.csv
        │       └── host2
        │           └── log_file_1.csv
        └── 08

我一直在尝试在Impala中创建一个外部表:

create external table log_type (
    field1    string,
    field2    string,
    ...
)
row format delimited fields terminated by '|' location '/logs/log_type/2013/08';

我希望Impala能够进入子目录并加载所有csv文件;但没有雪茄。 不会抛出任何错误,但没有数据加载到表中。

/logs/log_type/2013/08/*/*/logs/log_type/2013/08/*/*/*之类的不同内容也不起作用。

有办法做到这一点吗?或者我应该重组fs - 对此有任何建议吗?

3 个答案:

答案 0 :(得分:9)

如果您仍在搜索答案。 您需要手动注册每个单独的分区。

详情请见Registering External Table

您需要调整表格的架构

create external table log_type (
        field1    string,
        field2    string,
...)
  partitioned by (year int, month int, day int, host string)
  row format delimited fields terminated by '|';

更改架构后,要包括年,月,日和主机,您必须递归地将每个分区添加到表中。

像这样的东西

ALTER TABLE log_type ADD PARTITION (year=2013, month=07, day=28, host="host1")
    LOCATION '/logs/log_type/2013/07/28/host1';

之后你需要刷新黑斑羚羊的表格。

invalidate log_type;
refresh log_type;

答案 1 :(得分:0)

另一种方法可能是在Impala中使用LOAD DATA函数。如果您的数据采用SequenceFile或其他较少Impala友好格式(Impala file formats),您可以像上面的Joey一样创建外部表格,而不是ALTER TABLE,您可以执行类似

的操作
LOAD DATA INPATH '/logs/log_type/2013/07/28/host1/log_file_1.csv' INTO TABLE log_type PARTITION (year=2013, month=07, day=28, host=host1);

答案 2 :(得分:0)

使用较新版本的impala可以使用

ALTER TABLE name RECOVER PARTITIONS

命令。 More info

您需要注意的是,由于目录结构区分大小写,但impala查询不区分大小写,因此分区字段必须小写。