在'插入覆盖'中设置分区位置hive中的动态分区查询

时间:2018-05-31 01:30:30

标签: hadoop hive cloudera hive-partitions

我创建了一个基本位置指向AWS S3位置的配置单元表。 但是,我想使用' Insert Overwrite'在HDFS集群上创建一个分区。查询。

以下步骤:

-- Create intermediate table
create table test_int_ash
( loc string)
partitioned by (name string, age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile
location '/user/ash/test_int';

-- Insert into intermedate table with two names 'rash' and 'nash'
INSERT INTO test_int_ash partition (name="rash",age=20) values ('brisbane');
INSERT INTO test_int_ash partition (name="rash",age=30) values ('Sydney');
INSERT INTO test_int_ash partition (name="rash",age=40) values ('Melbourne');
INSERT INTO test_int_ash partition (name="rash",age=50) values ('Perth');

INSERT INTO test_int_ash partition (name="nash",age=50) values ('Auckland');
INSERT INTO test_int_ash partition (name="nash",age=40) values ('Wellington');


-- create curated table
create external table test_curated_ash
( loc string)
partitioned by (name string, age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile
location 's3a://mybucket/tmp/test_curated/'; 

-- load curated table from intermedate table, using dynamic partition method, creates partitions on aws s3.
insert overwrite table test_curated_ash partition(name='rash',age)
select loc,age from test_int_ash where name='rash' ;

-- I want to keep this partition on HDFS cluster, below query doesnt work 

insert overwrite table test_curated_ash partition(name='nash',age) location 'hdfs://mynamenode/user/ash/test_curated_new'
select loc,age from test_int_ash where name='nash';

以下查询有效,但我不想用“静态分区”来处理它。方法

alter table test_curated_ash add partition(name='nash',age=40) location 'hdfs://swmcdh1/user/contexti/ash/test_curated_new/name=nash/age=40';
alter table test_curated_ash add partition(name='nash',age=50) location 'hdfs://swmcdh1/user/contexti/ash/test_curated_new/name=nash/age=50';

insert overwrite table test_curated_ash partition(name='nash',age)
select loc,age from test_int_ash where name='nash'

您能否帮我解决如何在“插入覆盖”中设置分区位置的问题。动态查询?

2 个答案:

答案 0 :(得分:0)

假设我有一个名为“user”的表,我想使用country列动态分区。

查询:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=1000;
set hive.exec.max.dynamic.partitions.pernode=1000;

INSERT overwrite TABLE partitioned_user
    PARTITION (country)
        SELECT  firstname ,lastname,address,city,salary ,post,phone1,phone2,email,
        web,country FROM user;

将数据插入分区时,必须将分区列包含在查询的最后一列中。

设置hive.exec.dynamic.partition.mode = nonstrict;如果严格

在mapreduce严格模式(hive.mapred.mode = strict)中,不允许运行某些有风险的查询。它们包括:

  1. 笛卡尔积。
  2. 没有为查询选择分区。
  3. 比较bigints和字符串。
  4. 比较bigints和double。
  5. 无限制订购。
  6. 根据第2点和第5点,如果没有至少一个分区键过滤器(如WHERE country ='US')或ORDER BY子句而没有LIMIT条件,我们就不能使用SELECT语句。但默认情况下,此属性设置为nonstrict。

答案 1 :(得分:0)

您可以使用另一个中间表在HDFS上使用分区创建数据。

然后通过执行类似-

的操作,将分区在Final表中的位置更改为指向其他位置。

使用dbname; ALTER TABLE表名 分区(partname = value) SET LOCATION“位置”;

或者您可以直接为相应的SD_ID更新Hive Metastore表SDS