提供了如下的分区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 - 对此有任何建议吗?
答案 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查询不区分大小写,因此分区字段必须小写。