IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> HiveSql对城市关系进行打平 -> 正文阅读

[大数据]HiveSql对城市关系进行打平

一.数据源:

id,city,parentId
1,北京市,0
2,山东省,0
3,昌平区,1
4,海淀区,1
5,沙河镇,3
6,马池口镇,3
7,中关村,4
8,上地,4
9,烟台市,2
10,青岛市,2
11,单平区,9
12,芝果区,9
13,即墨区,10
14,城阳,10

注意: 一个id 唯一对应一个ParentId
         一个ParentId可以对应多个id

二.需要结果:

   一级   二级 三级
	0      1      3
1 北京市 昌平区 沙河镇
2 北京市 昌平区 马池口镇    
				  4   
3 北京市 海淀区 中关村
4 北京市 海淀区 上地
	0      2      9
5 山东省 烟台市 单平区
6 山东省 烟台市 芝果区
				  10
7 山东省 青岛市 即墨区
8 山东省 青岛市 城阳

三.hive sql

-- 创建表
create table if not exists city(
id int,
name string,
parentId int
)
row format delimited fields terminated by ',';

-- 初始化数据
load data local inpath '/opt/data/city.txt' overwrite into table city;

-- 统计
select c.level1,c.level2,d.name level3
from 
(
	select a.name as level1,b.name as level2,
	case
	when b.name='昌平区' then 1
	when b.name='海淀区' then 2
	when b.name='烟台市' then 3
	else 4 end as joinId
	from 
		(select name,if(name='北京市',1,0) joinId from city
		where parentId=0) a
	join 
		(select name,if(name='昌平区' or name='海淀区',1,0)  joinId from city
		where parentId in(1,2)) b 
	on a.joinId=b.joinId
) c
join 
(
	select name,
	case
	when name='沙河镇' or name ='马池口镇' then 1
	when name='中关村' or name ='上地' then 2
	when name='单平区' or name ='芝果区' then 3
	else 4 end as joinId
	from city
	where parentId in(3,4,9,10)
) d
on c.joinId=d.joinId;

# 更好的解决方式
with t as (select id,name,parentId from city)
select c.name level1,b.name level2,a.name level3 from t a
join t b on a.parentId=b.id
join t c on b.parentId=c.id;

level1	level2	level3
北京市	昌平区	沙河镇
北京市	昌平区	马池口镇
北京市	海淀区	中关村
北京市	海淀区	上地
山东省	烟台市	单平区
山东省	烟台市	芝果区
山东省	青岛市	即墨区
山东省	青岛市	城阳
Time taken: 9.515 seconds, Fetched: 8 row(s)


# 过程	

with t as (select id,name,parentId from city)
select a.*,b.* from t a
join t b on a.parentId=b.id;

a.id	a.name	a.parentid	b.id	b.name	b.parentid   关联  city.id	 city.name	city.parentid
3		昌平区		1		1		北京市	0             		1		 北京市		0
4		海淀区		1		1		北京市	0              		2		 山东省		0
9		烟台市		2		2		山东省	0              		3		 昌平区		1
10		青岛市		2		2		山东省	0              		4		 海淀区		1
5		沙河镇		3		3		昌平区	1              		5		 沙河镇		3
6		马池口镇	3		3		昌平区	1              		6		 马池口镇	3
7		中关村		4		4		海淀区	1              		7		 中关村		4
8		上地		4		4		海淀区	1              		8		 上地		4
11		单平区		9		9		烟台市	2              		9		 烟台市		2
12		芝果区		9		9		烟台市	2              		10		 青岛市		2
13		即墨区		10		10		青岛市	2              		11		 单平区		9
14		城阳		10		10		青岛市	2              		12		 芝果区		9
Time taken: 16.461 seconds, Fetched: 12 row(s)             		13		 即墨区		10


with t as (select id,name,parentId from city)
select  a.*,b.*,c.* from t a
join t b on a.parentId=b.id
join t c on b.parentId=c.id;

a.id	a.name	a.parentid	b.id	b.name	b.parentid	c.id	c.name	c.parentid
5		沙河镇		3		3		昌平区		1			1	北京市	0
6		马池口镇	3		3		昌平区		1			1	北京市	0
7		中关村		4		4		海淀区		1			1	北京市	0
8		上地		4		4		海淀区		1			1	北京市	0
11		单平区		9		9		烟台市		2			2	山东省	0
12		芝果区		9		9		烟台市		2			2	山东省	0
13		即墨区		10		10		青岛市		2			2	山东省	0
14		城阳		10		10		青岛市		2			2	山东省	0


# 自定义UDF出结果
select level1,level2,level3
from (
select 
city(id,'city') level3,
city(cast(city(id,'code') as int),'city') level2,
city(cast(city(cast(city(id,'code') as int),'code') as int),'city') level1
from city 
) a where level1 !='';

# 测试
# 根据id查父id
select id,city(id,'code') from city;
# 根据id查城市名
select city(id,'city') from city;

四. 输出结果

Total MapReduce CPU Time Spent: 0 msec
OK
c.level1	c.level2	level3
北京市	昌平区	沙河镇
北京市	昌平区	马池口镇
北京市	海淀区	中关村
北京市	海淀区	上地
山东省	烟台市	单平区
山东省	烟台市	芝果区
山东省	青岛市	即墨区
山东省	青岛市	城阳
Time taken: 37.589 seconds, Fetched: 8 row(s)
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:08:54  更:2021-07-26 12:09:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 7:37:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码