hive数据仓库表设计之(矮宽表+高窄表)
昨天面对某客户域做表关联的时候发现了。
有两张相同内容的主表。但是表的设计结构并不相同:
(每个领域都有主表,每次往这个领域(库)添加新表的时候一般都会join 主表,从而有唯一的主键id)
这两个表提供了这个领域的主键(id).
在这个
+------------+------------+----------+--+
| col_name | data_type | comment |
+------------+------------+----------+--+
| id | int | |
| name | string | |
| phone | string | |
| gender | string | |
| cardno | string | |
| age | string | |
| school | string | |
| quora | int | |
..
...
..
目测有60个字段这是一张宽表.
+------------+------------+----------+--+
+------------+------------+----------+--+
| col_name | data_type | comment |
+------------+------------+----------+--+
| id | int | |
| value1 | string | |
| type1 | string | |
| value2 | string | |
| type2 | string | |
| age | string | |
| school | string | |
| quora | int | |
目测有不到10个字段
+------------+------------+----------+--+
这是一张窄表
select type1,type2 from thistable group by type1,typ2;
发现类型数据有14种类左右
这样就相当于把第一个宽表的数据(可能剔除了不重要的字段)然后完全放开,行数暴增。
==============================================================================
我讲一下怎么用设计性能原理还要留给大家去分析:
每次都要从其他表抽取数据关联这个表id(唯一主键),比如这个第三方表名字叫第三方客户信息 没有id这列(毕竟id列是我们在自己的系统自己生成的),
只有用户名和手机号+(第三方提供的字段(比如一周洗几次澡)),我们用name+ phone去作为join on的条件关联主表窄表,得到新的有主键的表。
select id ,max(a.字段) from 第三方表 a
join
(select id,value1 as phone,value2 as name from 主表窄表 where type1=‘MOBILE_PHONE’ and type2='NAME' group by id,value1,value2) b
on a.phone=b.phone and a.name=b.name
group by id.
note:上面的group by 的作用主要是为了去重。
但是为什么这样设计?这又是对内存和计算效率(时间)之间的权衡
应该是减少对内存的需求。因为join关联必定要生成一个中间表。如果是宽表内存太大,但是窄表牺牲了关联效率。毕竟行数倍增原来十多倍。关于join的原理请看我另一份博客。
年前和项目老大聊了一会。他设计这个报表。感觉大佬的想法很nice。
hive数据仓库表设计之(矮宽表+高窄表)的更多相关文章
- MySQL库表设计小技巧
前言: 在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名.字段名命名混乱.字段类型设计混乱等等,此类数据库后续极难维护与拓展.我一直相信只有优秀的库表设计 ...
- Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
在下面这篇博文里,我给各位博客们,分享了创建HBase表,但这远不止打好基础. HBase编程 API入门系列之create(管理端而言)(8) 在关系型数据库里,表的高表和宽表是不存在的.在如HBa ...
- 高速查询hive数据仓库表中的总条数
Author: kwu 高速查询hive数据仓库中的条数.在查询hive表的条数,通常使用count(*).可是数据量大的时候,mr跑count(*)往往须要几分钟的时间. 1.传统方式获得总条数例如 ...
- Oracle 课程三之表设计
完成本课程的学习后,您应该能够: •普通堆表优点和缺点 •理解rowid •全局临时表优点.缺点和适用场景 •分区表的类型和原理.优点和缺点.适用场景 •表字段的高效设计 •sequence的设计 ...
- 分布式数据库HBase表设计
比较常用的数据库是关系型数据库,但很多场景下nosql数据库会更加擅长,从sql到nosql实施的第一步就是设计表结构,这是两种不同的思维方式,这里说下HBase表设计. 需求:需要一张stock表用 ...
- mysql系列十一、mysql优化笔记:表设计、sql优化、配置优化
可以从这些方面进行优化: 数据库(表)设计合理 SQL语句优化 数据库配置优化 系统层.硬件层优化 数据库设计 关系数据库三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非 ...
- 常见电商项目的数据库表设计(MySQL版)
转自:https://cloud.tencent.com/developer/article/1164332 简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL ...
- HBase概念学习(八)开发一个类twitter系统之表设计
这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...
- MaxCompute表设计最佳实践
MaxCompute表设计最佳实践 产生大量小文件的操作 MaxCompute表的小文件会影响存储和计算性能,因此我们先介绍下什么样的操作会产生大量小文件,从 而在做表设计的时候考虑避开此类操作. 使 ...
随机推荐
- centos7服务搭建常用服务配置之二:Rsync+sersync实现数据实时同步
目录 1.RSYNC数据备份 1.1 rsync服务简介 1.2 rsync特点和优势 1.3 rysnc运行模式简介 1.4 数据同步方式 2 Rsync实验测试 2.1 实验环境说明 2.2 服务 ...
- [Cometoj#4 B]奇偶性_打表
奇偶性 题目链接:https://cometoj.com/contest/39/problem/B?problem_id=1577 数据范围:略. 题解: 因为$f$的构造原因,很容易找到规律. 进而 ...
- GFS(Google File System,谷歌文件系统)----(1)读写一致性
GFS副本控制协议--中心化副本控制协议 对于副本集的更新操作有一个中心节点来协调管理,将分布式的并发操作转化为单点的并发操作,从而保证副本集内各节点的一致性.在GFS中,中心节点称之为Primary ...
- MyBatis配置文件中的标签mappers的子标签mapper的url属性
在浏览器中输入file:/可以打开访达根目录,file:后面至少跟一个杠 MyBatis配置文件中的标签mappers的子标签mapper的url属性中file:后面至少要跟两个杠
- # Ubuntu子系统安装配置
目录 Ubuntu子系统安装配置 安装配置 终端美化 卸载 和win10之间的交互 Ubuntu子系统安装配置 亲测启动速度毫秒之间 安装配置 系统升级到一周年正式版及以上(1607) 依次在 设置 ...
- lg 1478
好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...
- rabbitmq消息队列,消息发送失败,消息持久化,消费者处理失败相关
转:https://blog.csdn.net/u014373554/article/details/92686063 项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败. ...
- 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)
优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...
- c++11 用户定义字面量
c++11 用户定义字面量 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inc ...
- 在Android8.0以上收不到广播问题(AppWidget)
对Intent指定组件 //安卓8.0必须添加 intent.setComponent(new ComponentName(context,MyAppWidgetProvider.class)); 问 ...