【离线数仓-6-数据仓库开发ODS层设计要点】

news/2024/5/3 17:19:44/文章来源:https://blog.csdn.net/weixin_38136584/article/details/129183696

离线数仓-6-数据仓库开发ODS层设计要点

  • 离线数仓-6-数据仓库开发ODS层
    • 1.数据仓库开发ODS层设计要点
    • 2.ODS层用户行为日志表
      • 1.hive中复杂结构体复习
        • 1.array
        • 2.map
        • 3.struct 复杂结构
        • 4.嵌套格式
      • 2.hive中针对复杂结构字符串的练习
        • 1.针对ods层为json格式数据的练习
        • 2.用户行为日志表的设计
          • 用户行为日志表结构设计如下:
        • 3.业务表的设计-全量&增量

离线数仓-6-数据仓库开发ODS层

1.数据仓库开发ODS层设计要点

ODS层的设计要点如下:
(1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。
(2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip。
(3)ODS层表名的命名规范为:ods_表名_单分区增量全量标识(inc/full)。

2.ODS层用户行为日志表

  • 一个字符串需要执行反序列操作,才能转化成一个对象。
  • hive创建DDL的官网:
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

1.hive中复杂结构体复习

  • 官网配置如下:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-ComplexTypeConstructors

1.array

  • 1.定义:array<string>
  • 2.取值:arr[0]
  • 3.构造:array(val1,val2,val3,…),split(),collect_set()

2.map

  • 1.定义:map<string,bigint>
  • 2.取值:map[key]
  • 3.构造:map(key1,value1,key2,value2,…),str_to_map(text[,delimiter1,delimiter2])

3.struct 复杂结构

  • 1.定义:struct<id:int,name:string>
  • 2.取值:struct.id
  • 3.构造:named_struct(name1,val1,name2,val2,…)

4.嵌套格式

  • 1.定义: array<struct<id:int,name:string>>
  • 2.取值:
  • 3.构造:

2.hive中针对复杂结构字符串的练习

1.针对ods层为json格式数据的练习

--一、测试一,简单json对应的数据表格创建
--1.同步json本地数据到hive中,数据样例:{"id":1001,"name":"zhangsan"}
CREATE TABLE person(id int, name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
location '/person';-- 2.load数据:hive本地执行:load data local inpath '/data/person' overwrite into table person;-- 3.查看数据:
select * from person;-- 二、测试二,复杂结构json对应的数据表格创建,以及如何获取里面数据
-- 1.确定数据样例:{"id":1001,"name":"zhangsan","hobby":["reading","coding","smoking"],"address":{"country":"China","city":"Shandong"}}
-- 2.创建对应表格
DROP table if exists person;
CREATE TABLE person(id int, name string,hobby Array<string>,address struct<country:string,city:string>)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
location '/person';show tables;-- 3.load数据:hive本地执行:load data local inpath '/data/person' overwrite into table person;-- 4.查询数据
SELECT * from person;
-- 4.1 查询array数组类型里面的数据
SELECT hobby[0] as hobby0,hobby[1] as hobby1,hobby[2] as hobby2 from person;
-- 4.2 查询 struct类型里面的数据
SELECT address.country as country, address.city as city from person;

2.用户行为日志表的设计

  • 用户日志行为表分为两种:启动日志和用户行为日志,在设计用户日志行为表时,需要兼顾这两种格式的数据,要做到一张表融合所有的类型数据的字段,所以在设计用户行为日志表的时候,需要将以下7个字段都整合到一个表中,才能满足业务需求。
    在这里插入图片描述
  • hive中表结构的思考:行、列、分区。
  • 外部数据如果是 Gzip或者Bzip2 格式的数据,在建hive表的时候,可以不声明文本类型,hive官网介绍如下:https://cwiki.apache.org/confluence/display/Hive/CompressedStorage
    在这里插入图片描述
用户行为日志表结构设计如下:
  • 1.日志行为表结构如下:
DROP TABLE IF EXISTS ods_log_inc;
CREATE EXTERNAL TABLE ods_log_inc
(`common`   STRUCT<ar :STRING,ba :STRING,ch :STRING,is_new :STRING,md :STRING,mid :STRING,os :STRING,uid :STRING,vc:STRING> COMMENT '公共信息',`page`     STRUCT<during_time :STRING,item :STRING,item_type :STRING,last_page_id :STRING,page_id:STRING,source_type :STRING> COMMENT '页面信息',`actions`  ARRAY<STRUCT<action_id:STRING,item:STRING,item_type:STRING,ts:BIGINT>> COMMENT '动作信息',`displays` ARRAY<STRUCT<display_type :STRING,item :STRING,item_type :STRING,`order` :STRING,pos_id:STRING>> COMMENT '曝光信息',`start`    STRUCT<entry :STRING,loading_time :BIGINT,open_ad_id :BIGINT,open_ad_ms :BIGINT,open_ad_skip_ms:BIGINT> COMMENT '启动信息',`err`      STRUCT<error_code:BIGINT,msg:STRING> COMMENT '错误信息',`ts`       BIGINT  COMMENT '时间戳'
) COMMENT '活动信息表'PARTITIONED BY (`dt` STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'LOCATION '/warehouse/gmall/ods/ods_log_inc/';
  • 2.load数据到Hive表,脚本设计,脚本命名规范:数据源_to_目的地.sh hdfs_to_ods_log.sh
    • hive中执行load语句的时候,数据还是存储在hdfs的DataNode上,没有移动,实际上修改的是:hdfs中NameNode的元数据到真实文件路径的映射关系,没有真正的移动数据,load操作没有性能开销。
      load data inpath '/origin_data/gmall/log/topic_log/2020-06-14' into table ods_log_inc partition(dt='2020-06-14');
#!/bin/bash# 定义变量方便修改
APP=gmall# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
if [ -n "$1" ] ;thendo_date=$1
elsedo_date=`date -d "-1 day" +%F`
fiecho ================== 日志日期为 $do_date ==================
sql="
load data inpath '/origin_data/$APP/log/topic_log/$do_date' into table ${APP}.ods_log_inc partition(dt='$do_date');
"
hive -e "$sql"

3.业务表的设计-全量&增量

  • 全量表(通过DataX上传到HDFS,\t分割的text文本)结构设计

    • 1.分隔符,全量表字段都跟原来的保持一致,但是分割符要跟全量同步工具DataX的writer工具中的分隔符保持一致即可。
    • 2.空值的处理,DataX中,将空值存为了’ ‘空串,所以在创建hive表的时候,需要指定一下空值使用’ '空串来代替。 NULL DEFINED AS ' '
  • 增量表(通过Maxwell上传到HDFS,json文件)结构设计

    • 确定原始数据中,哪些字段需要保留
  • 1.创建表格

  • 2.书写同步数据脚本

#!/bin/bashAPP=gmallif [ -n "$2" ] ;thendo_date=$2
else do_date=`date -d '-1 day' +%F` # linux上输入 date --help 可以查看帮助命令,获取前一天的日期,并按照标准格式输出。
fiload_data(){sql=""for i in $*; do#判断路径是否存在hadoop fs -test -e /origin_data/$APP/db/${i:4}/$do_date  # 1.-test -e 判断路径是否存在,存在 echo $?返回0,否则返回1  2.i:4 字符串的分割,获取第五个字符及以后的字符串#路径存在方可装载数据if [[ $? = 0 ]]; thensql=$sql"load data inpath '/origin_data/$APP/db/${i:4}/$do_date' OVERWRITE into table ${APP}.$i partition(dt='$do_date');"fidonehive -e "$sql"
}case $1 in"ods_activity_info_full")load_data "ods_activity_info_full";;"ods_activity_rule_full")load_data "ods_activity_rule_full";;"ods_base_category1_full")load_data "ods_base_category1_full";;"ods_base_category2_full")load_data "ods_base_category2_full";;"ods_base_category3_full")load_data "ods_base_category3_full";;"ods_base_dic_full")load_data "ods_base_dic_full";;"ods_base_province_full")load_data "ods_base_province_full";;"ods_base_region_full")load_data "ods_base_region_full";;"ods_base_trademark_full")load_data "ods_base_trademark_full";;"ods_cart_info_full")load_data "ods_cart_info_full";;"ods_coupon_info_full")load_data "ods_coupon_info_full";;"ods_sku_attr_value_full")load_data "ods_sku_attr_value_full";;"ods_sku_info_full")load_data "ods_sku_info_full";;"ods_sku_sale_attr_value_full")load_data "ods_sku_sale_attr_value_full";;"ods_spu_info_full")load_data "ods_spu_info_full";;"ods_cart_info_inc")load_data "ods_cart_info_inc";;"ods_comment_info_inc")load_data "ods_comment_info_inc";;"ods_coupon_use_inc")load_data "ods_coupon_use_inc";;"ods_favor_info_inc")load_data "ods_favor_info_inc";;"ods_order_detail_inc")load_data "ods_order_detail_inc";;"ods_order_detail_activity_inc")load_data "ods_order_detail_activity_inc";;"ods_order_detail_coupon_inc")load_data "ods_order_detail_coupon_inc";;"ods_order_info_inc")load_data "ods_order_info_inc";;"ods_order_refund_info_inc")load_data "ods_order_refund_info_inc";;"ods_order_status_log_inc")load_data "ods_order_status_log_inc";;"ods_payment_info_inc")load_data "ods_payment_info_inc";;"ods_refund_payment_inc")load_data "ods_refund_payment_inc";;"ods_user_info_inc")load_data "ods_user_info_inc";;"all")load_data "ods_activity_info_full" "ods_activity_rule_full" "ods_base_category1_full" "ods_base_category2_full" "ods_base_category3_full" "ods_base_dic_full" "ods_base_province_full" "ods_base_region_full" "ods_base_trademark_full" "ods_cart_info_full" "ods_coupon_info_full" "ods_sku_attr_value_full" "ods_sku_info_full" "ods_sku_sale_attr_value_full" "ods_spu_info_full" "ods_cart_info_inc" "ods_comment_info_inc" "ods_coupon_use_inc" "ods_favor_info_inc" "ods_order_detail_inc" "ods_order_detail_activity_inc" "ods_order_detail_coupon_inc" "ods_order_info_inc" "ods_order_refund_info_inc" "ods_order_status_log_inc" "ods_payment_info_inc" "ods_refund_payment_inc" "ods_user_info_inc";;
esac

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_262290.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解数据库基本概念

数据库&#xff08;DataBase 简称 DB&#xff09;&#xff1a;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合数据库管理系统&#xff08;DataBase Management System 简称 DBMS&#xff09;&#xff1a;是一种操纵和管理数据库的大型软件&#xf…

获取Windows11开发环境及VirtualBox配置指南

今天我们来讲一讲Windows11开发环境的快速搭建&#xff0c;主要是通过Virtualbox虚拟机安装微软官方预先配置好的Windows11环境包&#xff0c;配置简单&#xff0c;开箱即用。 获取虚拟机打包镜像 微软官方提供了多个系统平台的Windows11虚拟机镜打包镜像&#xff0c;只需要导…

python--排序总结

1.快速排序 a.原理 快速排序的基本思想是在待排序的 n 个元素中任取一个元素&#xff08;通常取第一个元素&#xff09;作为基准&#xff0c;把该元素放人最终位置后&#xff0c;整个数据序列被基准分割成两个子序列&#xff0c;所有小于基准的元素放置在前子序列中&#xff0…

代码随想录算法训练营day40 | 动态规划 343. 整数拆分 96.不同的二叉搜索树

day40343. 整数拆分1、确定dp数组以及下标的含义2、确定递推公式3、dp数组如何初始化4、确定遍历顺序5、举例推导dp数组96.不同的二叉搜索树1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义2、确定递推公式3、dp数组如何初始化4、确定遍历顺序5、举例推导dp数组3…

[译文] 基于PostGIS3.1 生成格网数据

根据格网进行数据统计与分析是一种常用的方法&#xff0c;相比自然地理边界与行政管理边界而言&#xff0c;使用格网有如下特点&#xff1a;每个格网之间地位相等&#xff0c;没有上下级之分。每个格网的面积都相等。相邻两个格网单元中心点之间距离相等。适用于将数据从“空间…

【Kubernetes 企业项目实战】09、Rancher 2.6 管理 k8s-v1.23 及以上版本高可用集群

目录 一、Rancher 介绍 1.1Rancher简介 1.2 Rancher 和 k8s 的区别 1.3 Rancher 企业使用案例 二、安装 Rancher 2.1 初始化环境 2.2 安装 Rancher 2.3 登录 Rancher 平台 三、通过 Rancher 管理已存在的 k8s 集群 3.1 配置 rancher 3.2 导入 k8s ​四、通过 Ranc…

【MySQL】5.7版本解压安装配置

前言 之所以使用解压版本&#xff0c;而不使用exe安装&#xff0c;因为exe的安装方式删除过于麻烦&#xff01;&#xff01;&#xff01; 如果安装MySQL过程中&#xff0c;出错了或者想重新在来一把&#xff0c;删除mysql服务即可 sc delete mysql # 删除已经安装好的Mysql&a…

ICASSP2023录用率有可靠度还不错的消息了

点击文末公众号卡片&#xff0c;找对地方&#xff0c;轻松参会 由于录用邮件没说录用率&#xff0c;导致大家都不知道录用率是多少。 据一位群友的反馈&#xff0c;其小老板是meta review。该群友原话“接受率应该是42%”。 ICASSP2023投稿量6000&#xff0c;在投稿量大涨的…

可怕,chatGPT用3小时教会我数据

chatGPT这玩意真的是我的救星,用它作为我的Python教练,我用三个小时学会了数据处理(Pandas)和绘图(matplotlib)。 这两个库的学习,在之前已经困扰了我7个月。之前卡壳的原因,是我一直没有耐心从零开始,按照教材设置的教程去学习Python——我擅长在项目中学习,一点一点…

数字人文中的可视化

数字人文中的可视化罗煜楚1&#xff0c;吴昊1&#xff0c;郭宇涵1&#xff0c;谭绍聪1&#xff0c;刘灿1&#xff0c;蒋瑞珂1&#xff0c;袁晓如1,21北京大学智能学院机器感知与智能教育部重点实验室&#xff0c;北京 1008712北京大学大数据分析与应用技术国家工程实验室&#…

白帽黑客入行应该怎么学?零基础小白也能轻松上手!

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 1为什么网络安全行业是IT行业最后的红利&#xff1f; 根据腾讯安全发布的《互联网安全报告》&#xff0c;…

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…

月薪没到30K的测试员必须要会的技能,我先啃为敬

最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对软件测试的人才要求越来越高了。 基本上这样感慨的分为两类人 第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&#xff0c;自己还…

整数保序的离散化(C/C++)

目录 1. 离散化的概念 1.1 离散化的运用思路 1.2 离散化的方法 1.2.1 排序 1.2.2 确定一个元素离散化后的结果 1.3 案例分析 1.3.1 1.3.2 区间和 &#xff08;来源&#xff1a;Acwing&#xff09; 1. 离散化的概念 离散化&#xff0c;把无限空间中有限的个体映射到有限的…

用kinectv2运行orbslam2

前提 vim 、 cmake 、 git 、 gcc 、 g 这些一般都装了 主要是Pangolin 、 OpenCV 、 Eigen的安装 18.04建议Pangolin0.5 orbslam2安装、测试&#xff1a; git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 cd ORB_SLAM2 chmod x build.sh ./build.sh 编译…

归并排序及其应用

归并排序算法基于分而治之的概念&#xff0c;具体来说就是遍历一棵树&#xff0c;归并的过程是一个后序执行的动作。 由于我们知道每个子部分在合并后都是有序的&#xff0c;我们可以利用这个特性来解决一些问题。 上图可视化了merge sort algorithm的过程&#xff0c;我们很容…

【Spring中@Autowired和@Resource注解的区别?】

一.背景 Spring中Autowired和Resource注解的区别&#xff1f; Spring框架想必大家都知道吧&#xff0c;那么Spring中Autowired和Resource注解的区别你知道吗&#xff1f;如果不知道也不要紧&#xff0c;我们就一起来学习一起吧。 二.Autowired和Resource注解的区别&#xff1f…

【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (2)-触发器 前言 上文中提到触发器的类型有以下4种&#xff0c;其中第一种【计划】是常用的&#xff0c; 与其他工具/服务类似的方式&#…

电路分析:一个简单的光控灯电路

一个简单的光控灯电路 电路原理&#xff1a; 利用了光敏电阻、电容 、三极管的特性实现

冷知识,Chrome 控制台console.log()为什么返回undefined

前言 不知道各位有没有在Chrome控制台中&#xff0c;使用console.log()输出数据&#xff0c;例如 console.log(Hello World) 如果你曾经稍微留意&#xff0c;你会发现第二个返回值是undefined。是浏览器控制台出现BUG了嘛&#xff1f;我们期望的输出只有’Hello World’。 其…