Hive 在配置单元中填充带扣表格的步骤

Hive 在配置单元中填充带扣表格的步骤,hive,hiveql,Hive,Hiveql,我已经创建了一个以性别作为bucket列的配置单元表 创建表userinfoBucketeduserid INT、age INT、gender STRING、occulation STRING、zipcode STRING,按性别聚集成2个bucket行格式分隔字段,以存储为TEXTFILE的“|”结尾 将以下数据从文本文件加载到表中 用户id |年龄|性别|职业|邮编: 1 | 24 | M |技师| 85711 2 | 53 | F |其他| 94043 3 | 23 | M |作家| 32

我已经创建了一个以性别作为bucket列的配置单元表

创建表userinfoBucketeduserid INT、age INT、gender STRING、occulation STRING、zipcode STRING,按性别聚集成2个bucket行格式分隔字段,以存储为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.exforce.bucketing属性设置为true; 设置hive.exforce.bucketing=true

1,当使用load命令将数据插入表中时,不会创建存储桶。存储在一个存储桶中的所有数据

将数据本地输入路径“/home/mainnode/u.user”加载到表userinfobucked中

问题1,为什么数据不分成两个存储桶

2、当从其他表向表中插入数据时,数据存储在2个存储桶中。以下是我执行的命令:

插入到表userinfobucked中,从userinfo中选择*其中gender='M'

现在bucket1000000_0有以下数据: 1 | 24 | M |技师| 85711 4 | 24 | M |技师| 43537 6 | 42 | M |主管| 98101 7 | 57 | M |管理员| 91344

bucket2000001_0具有以下数据: 3 | 23 | M |作家| 32067

问题2,我不明白为什么数据被存储到两个存储桶中,即使所有相同的记录都具有相同的性别

然后,我再次使用下面的命令将数据插入表中。 插入到表userinfobucked中,从userinfo中选择*其中gender='F'

现在又创建了两个额外的存储桶000000\u 0\u copy\u 1000001\u 0\u copy\u 1,并将数据存储到这些存储桶中,而不是将数据插入现有的存储桶中。现在,即使CREATETABLE配置为2个存储桶,也会使总存储桶数增加到4个

问题3;为什么额外的bucket被创建为复制到现有bucket中

请澄清

谢谢
Sean

Bucketing由列的散列驱动。显然,M和F的结果是相同的散列。您可以考虑将分区键的性别部分——以确保它们在不同的物理文件中结束。

ButkTein是由列的散列驱动的。显然,M和F的结果是相同的散列。您可以考虑将分区键的性别部分——以确保它们在不同的物理文件中结束。

q1:为什么这不能插入到一个桶表中?

A1:看看如何插入带扣的桌子。配置单元不支持使用LOAD DATA INPATH直接从平面文件加载到带扣表,因此必须先将数据加载到常规表中,然后将覆盖插入带扣表中

问题2:为什么即使所有记录的bucket列值相同,插入的数据仍被拆分为两个bucket

嗯,这是不正常的行为。您不应该看到具有相同bucket列值的记录被散列到不同的bucket中。我怀疑您在Q1中尝试了上面的LoadDataInPath方法之后没有删除表并重新创建它。如果是这样的话,将在insert上创建新的bucket,而不考虑现有bucket中的内容,这将导致我们进入下一个问题

问题3:为什么要创建额外的存储桶,而不是插入现有的存储桶

A3:配置单元不会在插入时向文件追加新数据。即使您告诉Hive您的表已被压缩,它也只会散列您当前插入的数据;它不考虑表中已有的数据

要保持表定义中设置的存储桶数,每次插入时必须将所有数据散列在一起,并使用insert OVERRIDE而不是insert INTO来覆盖表

通常,如果您的表是分区的,那么执行此操作要容易得多,因此您不会每次必须执行插入操作时都复制和重新散列整个表。说到分区,因为它的基数很低,所以性别更适合作为分区值而不是桶值。很好地解释了这个概念

Q1:为什么插入带扣的桌子不起作用

A1:看看如何插入带扣的桌子。配置单元不支持使用LOAD DATA INPATH直接从平面文件加载到带扣表,因此必须先将数据加载到常规表中,然后将覆盖插入带扣表中

问题2:为什么即使所有记录的bucket列值相同,插入的数据仍被拆分为两个bucket

嗯,这是不正常的行为。您不应该看到具有相同bucket列值的记录被散列到不同的bucket中。我怀疑您在尝试上面的加载数据INPATH方法后没有删除表并重新创建它 第一季度。如果是这样的话,将在insert上创建新的bucket,而不考虑现有bucket中的内容,这将导致我们进入下一个问题

问题3:为什么要创建额外的存储桶,而不是插入现有的存储桶

A3:配置单元不会在插入时向文件追加新数据。即使您告诉Hive您的表已被压缩,它也只会散列您当前插入的数据;它不考虑表中已有的数据

要保持表定义中设置的存储桶数,每次插入时必须将所有数据散列在一起,并使用insert OVERRIDE而不是insert INTO来覆盖表


通常,如果您的表是分区的,那么执行此操作要容易得多,因此您不会每次必须执行插入操作时都复制和重新散列整个表。说到分区,因为它的基数很低,所以性别更适合作为分区值而不是桶值。很好地解释了这个概念

谢谢你的回复。我会试试的。但我很困惑,为什么每次我使用insert命令向表中插入数据时都会创建额外的存储桶,为什么相同性别的记录会存储到不同的存储桶中?请澄清,谢谢你的回复。我会试试的。但我很困惑,为什么每次我使用insert命令向表中插入数据时都会创建额外的存储桶,为什么相同性别的记录会存储到不同的存储桶中?请澄清。
load data local inpath '/home/mainnode/u.user' into table userinfobucketed;