拉链表设计:

  在企业中,由于有些流水表每日有几千万条记录,数据仓库保存5年数据的话很容易不堪重负,因此可以使用拉链表的算法来节省存储空间。

 例子:

  1. -- 用户信息表; 采集当日全量数据存储到 (当日) 表中
  2. CREATE TABLE dwd.user_info(
  3. id string,
  4. name string,
  5. sex string,
  6. biz_date string -- 业务日期
  7. )
  8.  
  9. -- 用户信息整合表
  10. CREATE TABLE dws.user_merge_info(
  11. id string,
  12. name string,
  13. sex string,
  14. start_date string,
  15. end_date string
  16. )
  17.  
  18. -- 测试插入用户信息
  19. INSERT INTO dwd.user_info
  20. SELECT
  21. '','YaoMing','boy',''
  22. UNION ALL
  23. SELECT
  24. '','YaoLinlin','girl',''
  25. UNION ALL
  26. SELECT
  27. '','CaiLili','girl',''
  28. UNION ALL
  29. SELECT
  30. '','ZhangSan','girl',''
  31. UNION ALL
  32. SELECT
  33. '','LiSi','girl',''
  34.  
  35. -- 查看数据
  36. SELECT * FROM dwd.user_info

  1. -- 初始化用户信息整合表
  2. INSERT overwrite TABLE dws.user_merge_info
  3. SELECT
  4. id,
  5. name,
  6. sex,
  7. '' AS start_date,
  8. '' AS end_date
  9. FROM (
  10. SELECT
  11. id,
  12. name,
  13. sex,
  14. row_number() over(PARTITION BY id ORDER BY biz_date) AS row_num -- 初始化时候根据主键id分组,取最新修改的数据
  15. FROM dwd.user_info
  16. ) t
  17. WHERE t.row_num = 1
  18.  
  19. -- 查看数据
  20. SELECT * FROM dws.user_merge_info

  1. -- 现在biz_date='20190702'这天,新跑了一条全新数据id=6,以及修改了一条id=2的数据
  2. INSERT INTO dwd.user_info
  3. SELECT
  4. '','WangWu','boy',''
  5. UNION ALL
  6. SELECT
  7. '','YaoLinlin','boy',''
  8.  
  9. -- 查看数据
  10. SELECT * FROM dwd.user_info ORDER BY id,biz_date

  1. -- 新增修改以及完全新增
  2. INSERT overwrite TABLE tmp.user_merge_info_new
  3. -- 修改的数据
  4. SELECT
  5. b.id,
  6. b.name,
  7. b.sex,
  8. '' AS start_date, -- ${bizdate} 业务日期
  9. '' AS end_date -- 99991231代表有效数据
  10. FROM dws.user_merge_info a,
  11. dwd.user_info b
  12. WHERE a.id = b.id
  13. AND a.end_date = ''
  14. AND b.biz_date = '' -- ${bizdate}只取当天数据
  15. AND (
  16. a.name!= b.name
  17. OR a.sex != b.sex
  18. )
  19.  
  20. UNION ALL
  21. -- 全新的数据
  22. SELECT
  23. b.id,
  24. b.name,
  25. b.sex,
  26. ''AS start_date,
  27. ''AS end_date
  28. FROM dws.user_merge_info a
  29. RIGHT JOIN dwd.user_info b
  30. ON a.id = b.id
  31. WHERE b.biz_date=''
  32. AND a.id IS NULL;

  1. -- 闭链
  2. INSERT overwrite TABLE tmp.user_merge_info_upt
  3. SELECT
  4. a.id,
  5. a.name,
  6. a.sex,
  7. a.start_date,
  8. '' -- 闭链,${biz_date}业务时间
  9. FROM dws.user_merge_info a
  10. LEFT JOIN dwd.user_info b
  11. ON a.id=b.id
  12. WHERE a.end_date=''
  13. AND b.biz_date=''
  14. AND (
  15. a.name != b.name
  16. OR a.sex != b.sex
  17. )

  1. -- 历史数据
  2. INSERT overwrite TABLE tmp.user_merge_info_new
  3. SELECT
  4. a.id,
  5. a.name,
  6. a.sex,
  7. a.start_date,
  8. a.end_date
  9. FROM dws.user_merge_info a,
  10. tmp.user_merge_info_upt b
  11. WHERE a.id != b.id;

  1. -- 整合数据
  2. INSERT OVERWRITE TABLE dws.user_merge_info
  3. SELECT
  4. id,
  5. name,
  6. sex,
  7. start_date,
  8. end_date
  9. FROM tmp.user_merge_info_new
  10. UNION ALL
  11. SELECT
  12. id,
  13. name,
  14. sex,
  15. start_date,
  16. end_date
  17. FROM tmp.user_merge_info_upt
  18. UNION ALL
  19. SELECT
  20. id,
  21. name,
  22. sex,
  23. start_date,
  24. end_date
  25. FROM tmp.user_merge_info_his
  26.  
  27. -- 查看下数据
  28. SELECT * FROM dws.user_merge_info ORDER BY id,start_date

以上拉链表就实现好了


以下是退链操作模板

  1. #!/bin/bash
  2.  
  3. # 使用说明提示
  4. if [ $# -ne 1 ]; then
  5. echo "Usage : `basename $0` biz_date"
  6. exit 1
  7. fi
  8.  
  9. #业务时间
  10. biz_date=$1
  11.  
  12. # 判断是数据整合还是回退拉链表
  13. isGoBack=`execHQL "select count(1) from dws.user_merge_info where (end_date>='$biz_date' or start_date>='$biz_date') and biz_date<>'';"`
  14.  
  15. if [ $isGoBack -ne 0 ];then
  16. # 回退模式
  17. Log "\n## 【user_merge_info表回退】 执行开始 ##"
  18. execHQL "
  19. INSERT overwrite TABLE dws.user_merge_info
  20. -- 完全不变的数据
  21. SELECT
  22. id
  23. ,name
  24. ,sex
  25. ,start_date
  26. ,end_date
  27. FROM dws.user_merge_info
  28. WHERE (start_date<'$biz_date' AND end_date='') OR end_date<'$biz_date'
  29.  
  30. UNION ALL
  31.  
  32. -- 重跑 重新开链的数据
  33. SELECT
  34. id
  35. ,name
  36. ,sex
  37. ,start_date
  38. ,'' AS end_date
  39. FROM dws.user_merge_info
  40. WHERE start_date<'$biz_date' AND end_date>='$biz_date' AND end_date<>'';
  41. "
  42. if [ $? -ne 0 ];then
  43. Log "\n## 【user_merge_info表回退】 执行失败 ##"
  44. exit 1
  45. fi
  46. Log "\n## 【user_merge_info表回退】 执行成功 ##"
  47.  
  48. fi

hive拉链表以及退链例子笔记的更多相关文章

  1. hive拉链表

    前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成:先分享一下拉链表的用途.什么是拉链表.通过一些小的使用场景来对拉链表做 ...

  2. hive拉链表取数

    例如,一个借款用户在hive上的拉链表.(end_dt存放逻辑与普通介绍的拉链表不一致) 需要拉去它在2019-05-01日的状态, 取数逻辑是: select * from tb where sta ...

  3. 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近 ...

  4. hive 汇率拉链表转日连续流水表

    1.什么是拉链表 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 我们先看一个示例,这就是一张拉链表,存储的 ...

  5. hive中拉链表

    在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间. 拉链表适用于以下几种情况吧 数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业 ...

  6. 数仓1.4 |业务数仓搭建| 拉链表| Presto

    电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...

  7. DataBase 之 拉链表结构设计

    一.概念 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 在历史表中对客户的一生的记录可能就这样几条记录,避 ...

  8. mysql执行拉链表操作

    拉链表需求: 1.数据量比较大 2.变化的比例和频率比较小,例如客户的住址信息,联系方式等,比如有1千万的用户数据,每天全量存储会存储很多不变的信息,对存储也是浪费,因此可以使用拉链表的算法来节省存储 ...

  9. xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

随机推荐

  1. go中指针类型的用法小结

    代码 // 指针的用法 package main import ( "fmt" ) func main() { var i int = 100 // 输出i的地址 fmt.Prin ...

  2. slot-scope 插槽 的使用 ——'<template slot-scope="page">'

    slot-scope="page"slot-scope 是一个插槽,拿外面的数据,可以获取当前一行的数据page.row.pageId 拿到当前行数据的pageId注意:slot- ...

  3. java指定若干个网络图片,打包为zip下载

    应项目要求需要将多个存在某url地址的图片,打包为zip下载下来 public void download(HttpServletRequest request, HttpServletRespons ...

  4. 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 + ...

  5. Kintex7XC7K325T板卡七仙女

  6. vsftp 主动模式安装

    server:192.168.109.137 client:192.168.109.138 ------------------------------------------------------ ...

  7. HTML5 音频播放

    代码实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. golang API

    1.server端程序 package main //简单的JSON Restful API演示(服务端) //author: Xiong Chuan Liang //date: 2015-2-28 ...

  9. 4. jaxp----dom解析器(DocumentBuilderFactory、DocumentBuilder)

    1.DocumentBuilderFactory--解析器工厂(抽象类 javax.xml.parsers.DocumentBuilderFactory) newInstance()  获取 Docu ...

  10. windows openssh安装

    下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases 解压好后打开目录,执行以下命令: powershell.exe -Execution ...