繁体   English   中英

蜂房,分区表的存储桶

[英]Hive, Bucketing for the partitioned table

这是我的脚本:

--table without partition

drop table if exists ufodata;
create table ufodata ( sighted string, reported string, city string, shape string, duration string, description string )
row format delimited
fields terminated by '\t'
Location '/mapreduce/hive/ufo';

--load my data in ufodata

load data local inpath '/home/training/downloads/ufo_awesome.tsv' into table ufodata;

--create partition table
drop table if exists partufo;
create table partufo ( sighted string, reported string, city string, shape string, duration string, description string )
partitioned by ( year string )
clustered by (year) into 6 buckets
row format delimited
fields terminated by '/t';

--by default dynamic partition is not set
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
--by default bucketing is false
set hive.enforcebucketing=true;

--loading mydata
insert overwrite table partufo
partition (year)
select sighted, reported, city, shape, min, description, SUBSTR(TRIM(sighted), 1,4) from ufodata;

错误信息:

失败:语义分析中的错误:无效的列引用

我尝试为分区表进行存储。 如果我删除“按(年份)分成6个存储桶”,则脚本可以正常工作。 如何存储分区表

在配置单元中进行存储桶操作时,有一件重要的事情要考虑。

相同的列名称不能同时用于存储区和分区。 原因如下:

群集和排序发生在分区内。 在每个分区内,只有一个与分区列关联的值(在您的情况下为年份),因此不会对聚类和排序产生任何影响。 那就是你出错的原因。

您可以使用以下语法创建具有分区的存储表。

CREATE TABLE bckt_movies
(mov_id BIGINT , mov_name STRING ,prod_studio STRING, col_world DOUBLE , col_us_canada DOUBLE , col_uk DOUBLE , col_aus DOUBLE)
PARTITIONED BY (rel_year STRING)
CLUSTERED BY(mov_id) INTO 6 BUCKETS; 

在进行动态分区时,请创建一个包含所有列(包括分区列)的临时表,并将数据加载到临时表中。

使用分区列创建实际的分区表。 从临时表加载数据时,分区列应位于select子句的最后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM