在hive中的“insert overwrite”动态分区查询中设置分区位置

shstlldc  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(1257)

我创建了一个配置单元表,其基本位置指向awss3位置。但是,我想使用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'

你能帮我在“插入-覆盖”动态查询中设置分区位置吗?

cwxwcias

cwxwcias1#

您可以使用另一个中间表在hdfs上创建分区数据。
然后在最后一个表中更改分区的位置以指向不同的位置,方法如下-
使用dbname;alter table\u name partition(partname=value)set location“位置”;
或者可以直接更新配置单元元存储表sds以获得适当的sd\u id

v64noz0r

v64noz0r2#

假设我有一个名为“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 strict模式(hive.mapred.mode=strict)下,不允许运行某些有风险的查询。它们包括:
笛卡尔积。
没有为查询选取分区。
比较bigint和string。
比较bigint和double。
订购无限制。
根据第2点和第5点,我们不能在分区表上使用至少没有一个分区键筛选器(如where country='us')的select语句或没有限制条件的order by子句。但默认情况下,此属性设置为nonstrict。

相关问题