我已经创建了一个配置单元表,其存储桶列为gender。
创建表userinfoBucketed(userid INT,age INT,性别字符串,职业字符串,邮政编码字符串),按(性别)聚类成2个存储桶格式的以'|‘结尾的分隔字段,存储为TEXTFILE;
将以下数据从文本文件加载到表中(用户id |年龄|性别|职业|邮政编码):
1|24|M|技师|85711
2|53|F|其他|94043
3|23|M|编写器|32067
4|24|M|技师|43537
5|33|F|其他|15213
6|42|M|高管|98101
7|57|M|管理员|91344
8|36|M|管理员|05201
9|29|M|学生|01002
10|53|M|律师|90703
我已将hive.enforce.bucketing属性设置为true;设置hive.enforce.bucketing=true;
1、当使用load命令将数据插入到表中时,不创建存储桶。存储在一个存储桶中的所有数据
将数据本地inpath '/home/mainnode/u.user‘加载到表userinfobucketed中;
Question1,为什么不把数据分成两个存储桶?
2、当从其他表中插入数据到表中时,数据存储在2个存储桶中。下面是我执行的命令:
插入到表userinfobucketed select * from userinfo where gender='M';
现在bucket1(000000_0)有以下数据:1|24|M|技术员|85711 4|24|M|技术员|43537 6|42|M|高管|98101 7|57|M|管理员|91344
bucket2(000001_0)有以下数据:3|23|M|写入器|32067
Question2,我不明白为什么数据被存储在两个存储桶中,即使所有相同的记录都具有相同的性别。
然后,我再次使用下面的命令将数据插入到表中。插入到表userinfobucketed select * from userinfo where gender='F';
现在又创建了两个额外的存储桶(000000__copy_1,000001__copy_1),并将数据存储到这些存储桶中,而不是将数据插入现有的存储桶中。现在,即使create table被配置为2个存储桶,总存储桶也是4个。
Question3;为什么要在其中创建额外的存储桶,而不是复制到现有存储桶中
请澄清
谢谢肖恩
发布于 2017-03-02 10:14:12
Q1:为什么这不能插入到一个分桶的表中?
load data local inpath '/home/mainnode/u.user' into table userinfobucketed;
A1:看看用于插入到存储桶表中的this tutorial。Hive不支持使用LOAD DATA INPATH
直接从平面文件加载到分桶表,因此您必须首先将数据LOAD
到一个常规表中,然后再INSERT OVERWRITE
到您的分桶表中。
Q2:为什么即使所有记录的存储桶列具有相同的值,插入的数据仍被拆分为两个存储桶?
A2:嗯。这是不正常的行为。您永远不会看到具有相同存储桶列值的记录被散列到不同的存储桶中。我怀疑您在Q1中尝试了上面的LOAD DATA INPATH
方法后,没有删除该表并重新创建它。如果是这种情况,将在插入上创建新的存储桶,而不考虑现有存储桶中的内容,这将我们引向下一个问题……
Q3:为什么要创建额外的存储桶,而不是插入现有的存储桶?
A3:配置单元在插入时不向文件追加新数据。即使您告诉Hive您的表是分桶的,它也只散列您当前插入的数据;它不会考虑表中已经存在的数据。
为了维持在表定义中设置的存储桶数量,您必须在每次执行insert时将所有数据散列在一起,并使用INSERT OVERWRITE
而不是INSERT INTO
覆盖该表。
通常,如果您的表是分区的,这样做会容易得多,因此您不必在每次执行插入操作时都复制和重新散列整个表。说到分区,由于它是如此低的基数,性别更适合作为分区值而不是桶值。This article在解释这个概念方面做得很好。
发布于 2014-12-13 22:09:40
分组法是由列的散列驱动的。显然,M和F产生了相同的散列。您可以考虑将性别作为分区键的一部分-以确保它们最终保存在不同的物理文件中。
https://stackoverflow.com/questions/27412175
复制相似问题