如何在hive中使用alter命令创建多个分区?

时间:2015-12-22 04:54:32

标签: hadoop

我在桌子上有2个分区,如下所示:

hive> show partitions alt_part;
OK
yop=2011
yop=2013

现在我想在2013年添加一个内部分区。但是我收到了以下错误。

  

蜂房> alter table alt_part add partition(yop = 2013,mop = 9);失败:   SemanticException分区规范{yop = 2013,mop = 9}包含   非分区列

如果我犯了一些错误,请纠正我。

我也尝试过定位....

  

hive> alter table alt_part add partition(yop = 2013,mop = 9)location' / user / revathi-prac / partitions / dec21 / yop = 2013 / mop = 9';

但我仍有同样的问题...

2 个答案:

答案 0 :(得分:0)

以下是在多个级别创建分区的示例。您是否已将yop和mop定义为create table命令的一部分。您可以通过运行show create table alt_part粘贴create table命令的语法并粘贴输出。

hive> CREATE TABLE `order_items`(
    >   `order_item_id` int, 
    >   `order_item_order_id` int, 
    >   `order_item_order_date` string, 
    >   `order_item_product_id` int, 
    >   `order_item_quantity` smallint, 
    >   `order_item_subtotal` float, 
    >   `order_item_product_price` float)
    > partitioned by (year int, month int);
OK
Time taken: 0.195 seconds
hive> alter table order_items add partition (year=2013, month=1);
OK
Time taken: 0.407 seconds
hive> show partitions order_items;
OK
year=2013/month=1
Time taken: 0.551 seconds, Fetched: 1 row(s)
hive> 

答案 1 :(得分:0)

有一种方法可以不花时间找出数据未加载的原因。

如果您的文件在/user/hive/warehouse之外,我强烈建议您使用外部表格。

CREATE EXTERNAL TABLE cars (
        vin BIGINT,
        model STRING,
        colour STRING
        ) 
        PARTITIONED BY (year STRING, month STRING)
        ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
        LOCATION '/user/revathi-prac/'; 

现在分区可以相对简单:

ALTER TABLE cars ADD PARTITION (year=2015, month=12)
LOCATION '/user/revathi-prac/2015/12'

指定正确的位置可以节省您使用像year=2015/month=12这样的hive自动创建的文件夹的时间,并且通过bash或python更容易遍历所有子文件夹。

此外,您需要在更改表之前创建适当的分区。您无法仅按分区year创建表格,然后尝试添加新的不存在的分区,例如month

希望有所帮助!