hive三表关联实验

1.建表灌数

CREATE TABLE master_camp.mtj_A (
	user_id STRING,
	mark STRING
);

CREATE TABLE master_camp.mtj_B (
	user_id STRING,
	mark STRING
);

CREATE TABLE master_camp.mtj_C (
	user_id STRING,
	mark STRING
);
INSERT INTO master_camp.mtj_a VALUES
('sq001', '001'),
('sq001', '002'),
('sq001', '003'),
('sq004', '004'), 
('sq005', '005');

INSERT INTO master_camp.mtj_b VALUES
('sq002', '002'),
('sq003', '003'),
('sq004', '004');

INSERT INTO master_camp.mtj_c (user_id, mark) VALUES
('sq003', '003'),
('sq004', '004'),
('sq005', '005');

2.实验

2.1 三表连续join(123)

SELECT a.user_id, b.user_id, c.user_id , a.mark , b.mark , c.mark  FROM mtj_a a 
left join mtj_b b on a.user_id = b.user_id 
left join mtj_c c on b.user_id = c.user_id;

在这里插入图片描述

2.2 三表连续join(12 13)

SELECT a.user_id, b.user_id, c.user_id , a.mark , b.mark , c.mark  FROM mtj_a a 
left join mtj_b b on a.user_id = b.user_id 
left join mtj_c c on a.user_id = c.user_id;

在这里插入图片描述

3.小结论

三表关联,注意关联字段,不注意,会丢失想要留下的数据。

### 关于Hive分桶的基础知识 Hive中的分桶是一种优化机制,用于提高查询性能并减少资源消耗。通过将数据划分为多个较小的子集(即桶),可以更高效地执行采样操作和分布式计算[^3]。 #### 数据分布原理 当数据被加载到分桶时,会基于指定列的哈希值进行分配。具体过程如下: 1. 对目标字段取哈希值。 2. 将该哈希值与定义的桶数量相除,并获取余数作为索引。 3. 根据索引决定数据应存储在哪一个具体的文件中。 这种设计使得每张或者其特定分区下的目录对应着若干独立的数据文件,每一个这样的文件代了一个逻辑上的“桶”。值得注意的是,在实际运行过程中,最终生成的桶数目通常等于Reduce任务的数量。 ```sql CREATE TABLE bucketed_table ( id INT, name STRING ) CLUSTERED BY (id) INTO 4 BUCKETS; ``` 上述SQL语句展示了如何创建一张具有四个桶结构的新`bucketed_table`,其中`id`字段用来确定记录归属哪个桶。 ### 可能遇到的问题及解决方案 尽管分桶能够带来诸多好处,但在实践当中也可能面临一些挑战: 1. **无法正常完成分桶** 如果发现数据并没有按照预期方式进入各个桶,则可能是由于未设置合适的参数所致。例如,默认情况下Hive不会启用严格模式来强制实施分箱规则。此时可以通过调整配置项`set hive.enforce.bucketing=true;` 来开启此功能[^1]。 2. **Bucket 数量不足引起倾斜** 当选定用作划分依据的键值分布极不均匀时,可能导致部分桶承载过多数据而其他则相对空闲的现象发生。为了避免这种情况,应当合理规划桶的数量以及选取适合做为分割标准的属性。 3. **与其他特性配合不当** 分桶经常和其他诸如排序、分区等功能联合运用以达到最佳效果。然而如果处理不好它们之间的关系的话,比如先进行了全局排序再尝试建立本地化的桶布局就可能出现矛盾冲突。因此需要仔细考虑整体架构设计。 ### 示例代码展示 下面给出一段简单的例子演示怎样向已存在的分桶里插入新数据: ```sql SET hive.exec.dynamic.partition.mode=nonstrict; INSERT OVERWRITE TABLE bucketed_table PARTITION(dt='2023-03-01') SELECT id, name FROM source_table DISTRIBUTE BY id SORT BY id; ``` 这里设置了动态分区模式允许覆盖写入,并且利用了Distribute By 和Sort By命令确保输入源按既定策略正确映射至目的端各相应位置上去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海若[MATRIX]

鼓励将是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值