HIVE 中 内连接 外连接 左外连接 右外连接 全外连接 联合操作

本文详细介绍了Hive SQL中的各种Join操作,包括内连接、左外连接、右外连接、全外连接及笛卡尔连接,并展示了如何使用OrderBy进行全排序以及SortBy进行局部排序。同时,还演示了Union操作的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive的join操作,只支持等值连接

创建customers和orders表,一对多关系

创建customers表

create table customers(id int,name string,age int) 
row format delimited 
fields TERMINATED by '\t' 
lines TERMINATED by '\n' 
stored as textfile;
数据准备:
customers.txt

1	tom1	12
2	tom2	13
3	tom3	14

加载数据

load data local inpath '/home/hadoop/customers.txt' into table customers;

创建表orders

create table orders(id int,ordernum string,price float,cid int)
row format delimited 
fields TERMINATED by '\t' 
lines TERMINATED by '\n' 
stored as textfile;

数据准备

orders.txt
1	No001	121.01	1
2	No002	121.02	1
3	No003	121.03	1
4	No004	121.04	2
5	No005	121.05	2
6	No006	121.06	2
7	No007	121.07	

加载数据

load data local inpath '/home/hadoop/orders.txt' into table orders;

内连接 join -- on

hive (hive1)> select a.id,a.name,b.id,b.ordernum,b.price from customers a join orders b on a.id = b.cid;


a.id	a.name	b.id	b.ordernum	b.price
1	tom1	1	No001	121.01
1	tom1	2	No002	121.02
1	tom1	3	No003	121.03
2	tom2	4	No004	121.04
2	tom2	5	No005	121.05
2	tom2	6	No006	121.06
Time taken: 30.041 seconds, Fetched: 6 row(s)

左外连接

hive (hive1)> select a.id,a.name,b.id,b.ordernum,b.price from customers a left outer join orders b on a.id = b.cid;


a.id	a.name	b.id	b.ordernum	b.price
1	tom1	1	No001	121.01
1	tom1	2	No002	121.02
1	tom1	3	No003	121.03
2	tom2	4	No004	121.04
2	tom2	5	No005	121.05
2	tom2	6	No006	121.06
3	tom3	NULL	NULL	NULL


右外连接

hive (hive1)> select a.id,a.name,b.id,b.ordernum,b.price from customers a right outer join orders b on a.id = b.cid;


a.id	a.name	b.id	b.ordernum	b.price
1	tom1	1	No001	121.01
1	tom1	2	No002	121.02
1	tom1	3	No003	121.03
2	tom2	4	No004	121.04
2	tom2	5	No005	121.05
2	tom2	6	No006	121.06
NULL	NULL	7	No007	121.07

全外连接

hive (hive1)>  select a.id,a.name,b.id,b.ordernum,b.price from customers a full outer join orders b on a.id = b.cid;


a.id	a.name	b.id	b.ordernum	b.price
NULL	NULL	7	No007	121.07
1	tom1	3	No003	121.03
1	tom1	2	No002	121.02
1	tom1	1	No001	121.01
2	tom2	6	No006	121.06
2	tom2	5	No005	121.05
2	tom2	4	No004	121.04
3	tom3	NULL	NULL	NULL

左半连接,select 和 where 子句不能引用到右边表字段

左表的记录在右表中一旦找到对应的记录,右侧表既停止扫描        (hive不支持右半连接操作 right semi join xxx)


hive (hive1)>  select c.id,c.name from customers c left semi join orders o on c.id=o.cid;


c.id	c.name
1	tom1
2	tom2
Time taken: 30.345 seconds, Fetched: 2 row(s)


笛卡尔连接 m x n

hive (hive1)> select c.id,c.name,o.ordernum from customers c join orders o;


c.id	c.name	o.ordernum
1	tom1	No001
2	tom2	No001
3	tom3	No001
1	tom1	No002
2	tom2	No002
3	tom3	No002
1	tom1	No003
2	tom2	No003
3	tom3	No003
1	tom1	No004
2	tom2	No004
3	tom3	No004
1	tom1	No005
2	tom2	No005
3	tom3	No005
1	tom1	No006
2	tom2	No006
3	tom3	No006
1	tom1	No007
2	tom2	No007
3	tom3	No007

order by 全排序,对所有的数据通过一个reduce进行排序

如果开启了hive.mapred.mode=strict,在全排序时必须结合limit使用

现在推荐使用hive.strict.check.* 属性

hive (hive1)> select * from orders order by cid asc,price desc;


orders.id	orders.ordernum	orders.price	orders.cid
7	No007	121.07	NULL
3	No003	121.03	1
2	No002	121.02	1
1	No001	121.01	1
6	No006	121.06	2
5	No005	121.05	2
4	No004	121.04	2
Time taken: 28.336 seconds, Fetched: 7 row(s)

sort by 每一reduce进行排序(局部排序)

hive (hive1)> select * from orders sort by cid asc,price desc;  


orders.id	orders.ordernum	orders.price	orders.cid
7	No007	121.07	NULL
3	No003	121.03	1
2	No002	121.02	1
1	No001	121.01	1
6	No006	121.06	2
5	No005	121.05	2
4	No004	121.04	2
Time taken: 26.294 seconds, Fetched: 7 row(s)

union 联合操作        (union all 联合操作 字段类型和个数需要匹配)

hive (hive1)> select id,name from customers union select id,ordernum from orders;


u2.id	u2.name
1	No001
1	tom1
2	No002
2	tom2
3	No003
3	tom3
4	No004
5	No005
6	No006
7	No007
Time taken: 28.261 seconds, Fetched: 10 row(s)


### 安装 Hive 和配置与 MongoDB 集成 #### 一、安装 Hive 为了在 CentOS 上成功安装 Hive,需按照以下方法操作: 1. **下载并解压 Hive** 下载最新版本的 Apache Hive 并将其解压缩至指定路径。可以使用 `wget` 命令完成此过程[^2]。 ```bash wget https://downloads.apache.org/hive/stable/apache-hive-3.1.2-bin.tar.gz tar -xzvf apache-hive-3.1.2-bin.tar.gz -C /usr/local/ ln -s /usr/local/apache-hive-3.1.2-bin /usr/local/hive ``` 2. **设置环境变量** 编辑 `/etc/profile` 文件以添加 Hive 的环境变量,并使更改生效。 ```bash echo 'export HIVE_HOME=/usr/local/hive' >> /etc/profile echo 'export PATH=$PATH:$HIVE_HOME/bin' >> /etc/profile source /etc/profile ``` 3. **配置 Hive 运行环境** 切换到 `$HIVE_HOME/conf/` 目录下编辑必要的文件来定义 Hive 的运行参数。 ```bash cp hive-default.xml.template hive-site.xml vi $HIVE_HOME/conf/hive-site.xml ``` 在 `hive-site.xml` 中增加如下内容以便于后续连接 MySQL 或其他元存储服务(如果需要)。 ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> ``` --- #### 二、配置 Hive 与 MongoDB 的集成 要实现 Hive 与 MongoDB 的无缝协作,可以通过 MongoDB 提供的 Hive Connector 来达成目标。 1. **安装 MongoDB-Hive Connector** 下载适用于当前 Hive 版本的 MongoDB-Hive Connector JAR 包,并放置到 Hive 的 lib 路径中。 ```bash mkdir -p $HIVE_HOME/lib/mongo cd $HIVE_HOME/lib/mongo wget https://repo.mongodb.com/artifactory/repo/com/mongodb/mongo-hadoop-core/latest.jar mv latest.jar mongo-hadoop-core-latest.jar ``` 2. **修改 Hive-Site.XML** 更新 `hive-site.xml` 文件以支持 MongoDB 数据源。 ```xml <property> <name>hive.input.format</name> <value>org.apache.hadoop.hive.ql.io.MongoInputFormat</value> </property> <property> <name>hive.output.format</name> <value>org.apache.hadoop.hive.ql.io.MongoOutputFormat</value> </property> <property> <name>hive.mongo.input.uri</name> <value>mongodb://localhost:27017/test.user</value> </property> <property> <name>hive.mongo.output.uri</name> <value>mongodb://localhost:27017/test.new_user</value> </property> ``` 3. **创建外部表映射 MongoDB 数据集合** 使用 Hive CLI 创建一张指向 MongoDB 表的数据结构。 ```sql CREATE EXTERNAL TABLE user_mongo ( name STRING, age INT ) STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' WITH SERDEPROPERTIES ('mongo.columns.mapping'='{"name":"name","age":"age"}'); ``` 4. **验证数据读写功能** 插入测试记录或者查询已有的文档以确认两者之间的交互正常工作。 ```sql INSERT INTO TABLE user_mongo VALUES('zhangsan', 30); SELECT * FROM user_mongo; ``` --- ### 总结 通过上述步骤,在 CentOS 系统上完成了 Hive 的部署以及与 MongoDB 的联合配置。这使得能够利用 SQL 查询语法处理 NoSQL 数据库中的非结构化信息[^1][^3]。 ```python print("Integration Completed!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值