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

4

假设有以下分区文件系统结构:

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个回答

9
如果您仍在寻找答案,需要手动注册每个单独的分区。
有关详细信息,请参见注册外部表
您的表模式需要进行调整。
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';

之后您需要在Impala中刷新表格。
invalidate log_type;
refresh log_type;

0

另一种方法是使用Impala中的LOAD DATA函数来完成。如果您的数据存储在SequenceFile或其他不太适合Impala的格式中(Impala文件格式),您可以像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);

0

在较新的 Impala 版本中,您可以使用

ALTER TABLE name RECOVER PARTITIONS

命令。更多信息

需要注意的是,分区字段必须小写,因为目录结构区分大小写,但 Impala 查询不区分大小写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接