在Hive文档中,它讨论了外部表的动态分区:https://cwiki.apache.org/confluence/display/Hive/HCatalog+DynamicPartitions。
我最近升级到Hive 0.12并希望通过在DDL的位置部分提供表的根HDFS位置来使用动态外部表分区,然后添加子目录,然后将自动添加到表。子目录将由Flume代理创建,该代理将日期添加为路径名。我希望Hive表位于根目录之上,以便能够自动在子目录中获取新数据。
例如,如果根位置是:
hdfs:///partitionTest
我使用路径
在Flume中添加数据hdfs:///partitionTest/year=%Y/month=%m/day=%d
我的Hive DDL声明在哪里:
create external table partitionTest (line String)
partitioned by (year int, month int, day int)
stored as sequencefile
location 'hdfs:///partitionTest';
我仍然发现自己必须使用alter table语句手动添加分区,或者从包含相关分区字段的另一个表中将数据插入此表 - 这会将数据写入HDFS上正确的目录结构。
我认为Hive 0.12允许我将数据写入HDFS然后会自动将其添加到表格中,这是错误的吗?我是否总是需要手动为Hive添加分区以获取新数据?
答案 0 :(得分:0)
如果您的表是外部的,并且它是静态分区,则是每次创建新分区时必须添加分区(使用alter命令)。
如果是内部表,并且它是静态分区,则必须使用LOAD命令或使用insert into命令。
如果是动态分区,则select查询中的最后一列将是分区值。 Till Hive 0.13这是程序。
希望它有帮助...... !!!
答案 1 :(得分:0)
如果手动添加分区外/不通过hive命令,请运行repair table命令以获取分区。看看这是否成功
MSCK REPAIR TABLE table_name; 要么 ALTER TABLE table_name RECOVER PARTITIONS;