从分区文件结构创建 Impala 外部表
Posted
技术标签:
【中文标题】从分区文件结构创建 Impala 外部表【英文标题】:Creating Impala external table from a partitioned file structure 【发布时间】:2013-08-07 16:42:41 【问题描述】:提供了一个分区的 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/*/*/*
等不同的 glob 也不起作用。
有没有办法做到这一点?或者我应该重组 fs - 对此有何建议?
【问题讨论】:
【参考方案1】:如果您仍在寻找答案。 您需要手动注册每个单独的分区。
详情请看这里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';
之后你需要在 impala 中刷新表格。
invalidate log_type;
refresh log_type;
【讨论】:
【参考方案2】:另一种方法是使用 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);
【讨论】:
【参考方案3】:有了新版本的 impala,您可以使用
ALTER TABLE name RECOVER PARTITIONS
命令。 More info
您需要注意的是,分区字段必须小写,因为目录结构区分大小写,但 impala 查询不区分。
【讨论】:
以上是关于从分区文件结构创建 Impala 外部表的主要内容,如果未能解决你的问题,请参考以下文章