hive拉链表以及退链例子笔记
拉链表设计:
在企业中,由于有些流水表每日有几千万条记录,数据仓库保存5年数据的话很容易不堪重负,因此可以使用拉链表的算法来节省存储空间。
例子:
- -- 用户信息表; 采集当日全量数据存储到 (当日) 表中
- CREATE TABLE dwd.user_info(
- id string,
- name string,
- sex string,
- biz_date string -- 业务日期
- )
- -- 用户信息整合表
- CREATE TABLE dws.user_merge_info(
- id string,
- name string,
- sex string,
- start_date string,
- end_date string
- )
- -- 测试插入用户信息
- INSERT INTO dwd.user_info
- SELECT
- '','YaoMing','boy',''
- UNION ALL
- SELECT
- '','YaoLinlin','girl',''
- UNION ALL
- SELECT
- '','CaiLili','girl',''
- UNION ALL
- SELECT
- '','ZhangSan','girl',''
- UNION ALL
- SELECT
- '','LiSi','girl',''
- -- 查看数据
- SELECT * FROM dwd.user_info
- -- 初始化用户信息整合表
- INSERT overwrite TABLE dws.user_merge_info
- SELECT
- id,
- name,
- sex,
- '' AS start_date,
- '' AS end_date
- FROM (
- SELECT
- id,
- name,
- sex,
- row_number() over(PARTITION BY id ORDER BY biz_date) AS row_num -- 初始化时候根据主键id分组,取最新修改的数据
- FROM dwd.user_info
- ) t
- WHERE t.row_num = 1
- -- 查看数据
- SELECT * FROM dws.user_merge_info
- -- 现在biz_date='20190702'这天,新跑了一条全新数据id=6,以及修改了一条id=2的数据
- INSERT INTO dwd.user_info
- SELECT
- '','WangWu','boy',''
- UNION ALL
- SELECT
- '','YaoLinlin','boy',''
- -- 查看数据
- SELECT * FROM dwd.user_info ORDER BY id,biz_date
- -- 新增修改以及完全新增
- INSERT overwrite TABLE tmp.user_merge_info_new
- -- 修改的数据
- SELECT
- b.id,
- b.name,
- b.sex,
- '' AS start_date, -- ${bizdate} 业务日期
- '' AS end_date -- 99991231代表有效数据
- FROM dws.user_merge_info a,
- dwd.user_info b
- WHERE a.id = b.id
- AND a.end_date = ''
- AND b.biz_date = '' -- ${bizdate}只取当天数据
- AND (
- a.name!= b.name
- OR a.sex != b.sex
- )
- UNION ALL
- -- 全新的数据
- SELECT
- b.id,
- b.name,
- b.sex,
- ''AS start_date,
- ''AS end_date
- FROM dws.user_merge_info a
- RIGHT JOIN dwd.user_info b
- ON a.id = b.id
- WHERE b.biz_date=''
- AND a.id IS NULL;
- -- 闭链
- INSERT overwrite TABLE tmp.user_merge_info_upt
- SELECT
- a.id,
- a.name,
- a.sex,
- a.start_date,
- '' -- 闭链,${biz_date}业务时间
- FROM dws.user_merge_info a
- LEFT JOIN dwd.user_info b
- ON a.id=b.id
- WHERE a.end_date=''
- AND b.biz_date=''
- AND (
- a.name != b.name
- OR a.sex != b.sex
- )
- -- 历史数据
- INSERT overwrite TABLE tmp.user_merge_info_new
- SELECT
- a.id,
- a.name,
- a.sex,
- a.start_date,
- a.end_date
- FROM dws.user_merge_info a,
- tmp.user_merge_info_upt b
- WHERE a.id != b.id;
- -- 整合数据
- INSERT OVERWRITE TABLE dws.user_merge_info
- SELECT
- id,
- name,
- sex,
- start_date,
- end_date
- FROM tmp.user_merge_info_new
- UNION ALL
- SELECT
- id,
- name,
- sex,
- start_date,
- end_date
- FROM tmp.user_merge_info_upt
- UNION ALL
- SELECT
- id,
- name,
- sex,
- start_date,
- end_date
- FROM tmp.user_merge_info_his
- -- 查看下数据
- SELECT * FROM dws.user_merge_info ORDER BY id,start_date
以上拉链表就实现好了
以下是退链操作模板
- #!/bin/bash
- # 使用说明提示
- if [ $# -ne 1 ]; then
- echo "Usage : `basename $0` biz_date"
- exit 1
- fi
- #业务时间
- biz_date=$1
- # 判断是数据整合还是回退拉链表
- isGoBack=`execHQL "select count(1) from dws.user_merge_info where (end_date>='$biz_date' or start_date>='$biz_date') and biz_date<>'';"`
- if [ $isGoBack -ne 0 ];then
- # 回退模式
- Log "\n## 【user_merge_info表回退】 执行开始 ##"
- execHQL "
- INSERT overwrite TABLE dws.user_merge_info
- -- 完全不变的数据
- SELECT
- id
- ,name
- ,sex
- ,start_date
- ,end_date
- FROM dws.user_merge_info
- WHERE (start_date<'$biz_date' AND end_date='') OR end_date<'$biz_date'
- UNION ALL
- -- 重跑 重新开链的数据
- SELECT
- id
- ,name
- ,sex
- ,start_date
- ,'' AS end_date
- FROM dws.user_merge_info
- WHERE start_date<'$biz_date' AND end_date>='$biz_date' AND end_date<>'';
- "
- if [ $? -ne 0 ];then
- Log "\n## 【user_merge_info表回退】 执行失败 ##"
- exit 1
- fi
- Log "\n## 【user_merge_info表回退】 执行成功 ##"
- fi
hive拉链表以及退链例子笔记的更多相关文章
- hive拉链表
前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成:先分享一下拉链表的用途.什么是拉链表.通过一些小的使用场景来对拉链表做 ...
- hive拉链表取数
例如,一个借款用户在hive上的拉链表.(end_dt存放逻辑与普通介绍的拉链表不一致) 需要拉去它在2019-05-01日的状态, 取数逻辑是: select * from tb where sta ...
- 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近 ...
- hive 汇率拉链表转日连续流水表
1.什么是拉链表 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 我们先看一个示例,这就是一张拉链表,存储的 ...
- hive中拉链表
在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间. 拉链表适用于以下几种情况吧 数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业 ...
- 数仓1.4 |业务数仓搭建| 拉链表| Presto
电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...
- DataBase 之 拉链表结构设计
一.概念 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 在历史表中对客户的一生的记录可能就这样几条记录,避 ...
- mysql执行拉链表操作
拉链表需求: 1.数据量比较大 2.变化的比例和频率比较小,例如客户的住址信息,联系方式等,比如有1千万的用户数据,每天全量存储会存储很多不变的信息,对存储也是浪费,因此可以使用拉链表的算法来节省存储 ...
- xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
随机推荐
- go中指针类型的用法小结
代码 // 指针的用法 package main import ( "fmt" ) func main() { var i int = 100 // 输出i的地址 fmt.Prin ...
- slot-scope 插槽 的使用 ——'<template slot-scope="page">'
slot-scope="page"slot-scope 是一个插槽,拿外面的数据,可以获取当前一行的数据page.row.pageId 拿到当前行数据的pageId注意:slot- ...
- java指定若干个网络图片,打包为zip下载
应项目要求需要将多个存在某url地址的图片,打包为zip下载下来 public void download(HttpServletRequest request, HttpServletRespons ...
- 2018-11-15-UWP-how-to-get-the-touch-width
title author date CreateTime categories UWP how to get the touch width lindexi 2018-11-15 18:49:12 + ...
- Kintex7XC7K325T板卡七仙女
- vsftp 主动模式安装
server:192.168.109.137 client:192.168.109.138 ------------------------------------------------------ ...
- HTML5 音频播放
代码实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- golang API
1.server端程序 package main //简单的JSON Restful API演示(服务端) //author: Xiong Chuan Liang //date: 2015-2-28 ...
- 4. jaxp----dom解析器(DocumentBuilderFactory、DocumentBuilder)
1.DocumentBuilderFactory--解析器工厂(抽象类 javax.xml.parsers.DocumentBuilderFactory) newInstance() 获取 Docu ...
- windows openssh安装
下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases 解压好后打开目录,执行以下命令: powershell.exe -Execution ...