【问题标题】:How to create multiple partitions using alter command in hive?如何在 hive 中使用 alter 命令创建多个分区?
【发布时间】:2016-03-28 07:01:42
【问题描述】:

我在一张表上有 2 个分区,如下所示:

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

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

hive> 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';

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

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    有一种方法可以做到这一点,而无需花时间弄清楚为什么您的数据也没有加载。

    如果您的文件位于/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

    希望对您有所帮助!

    【讨论】:

    • 嗨,我没有将 mop 作为创建表命令的一部分。我已经厌倦了您建议的方式..它起作用了..但是,实际上我想知道的是...如果我在创建表时将拖把创建为分区,并想将其添加为yop的内部分区,是否存在有什么办法吗??
    • 据我了解,您正在寻找动态分区cwiki.apache.org/confluence/display/Hive/DynamicPartitions
    • no ...我们可以使用 alter 命令解决我的问题吗?如下所示:alter table alt_part_m add partition(yop=2012,mop=2) location '/user/revathi-prac/partitions/dec23/yop=2012/mop=2';
    • 不,您需要一个密钥才能对您的表进行分区。您可以在之前分配适当的分区并通过它们更改表,或者创建动态分区,或者只使用可以满足您需求的 Impala。
    【解决方案2】:

    这是在多个级别创建分区的示例。您是否将 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> 
    

    【讨论】:

    • 感谢 Durga 的帮助。但我没有将 mop 作为创建表命令的一部分。我已经厌倦了您建议的方式..它起作用了..但是,实际上我想知道的是...如果我在创建表时将拖把创建为分区,并想将其添加为yop的内部分区,是否存在有什么办法吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多