数仓搭建实操(传统数仓oracle):DWD数据明细层

数据处理思路

DWD层, 数据明细层>>数据清洗转换, 区分事实表,维度表

全是事实表,没有维度表>>不做处理

数据清洗>>数据类型varchar 变成varchar2, 日期格式统一(时间类型变成varchar2); 字符数据去空格

 知识补充:

varchar 存储定长字符类型 ; 存储的数据会根据定义的长度来占用空间,不足部分会用空格填充

varchar2 存储可变长度字符串 ; 只占用实际存储数据所需的空间加上一个额外的字节来记录长度

varchar2是oracle数据库特有的, varchar是大多数数据库通用的

把数据类型从varchar 变成varchar2也是为了数据存储时不占用过多的空间

查看表中数据的存储是否有空格占空间

示例

以公司客户信息表(CI_CIE_CORP_CUST_INFO)为例

查看结果>>原表中的数据空格占用了大量的空间

解决>>更改varchar的存储长度/把varchar变成varchar2

实操示例1

建表

批量建表>>使用PLSQL

建表的表结构和注释需和ODS层(用户)一致, 需要的信息是: 表名, 表字段, 字段注释>>定义3个游标从ODS层循环获取

建表时进行的数据清洗>>把char类型变成varchar2类型; 把时间类型变成varchar2类型

DECLARE-- 获取ODS用户的表名CURSOR C_TABLES IS  SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = 'ODS';-- 获取ODS用户下所有表的字段CURSOR C_COLUMNS (P_TABLE VARCHAR2) ISSELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALEFROM DBA_TAB_COLUMNS WHERE OWNER = 'ODS' AND TABLE_NAME = P_TABLE ORDER BY COLUMN_ID;-- 获取所有的字段注释CURSOR C_COL_COMMENTS (P_TABLE VARCHAR2) ISSELECT COLUMN_NAME,COMMENTSFROM DBA_COL_COMMENTS WHERE OWNER = 'ODS' AND TABLE_NAME = P_TABLE;V_SQL VARCHAR2(3000); -- 构建sql语句V_DATA_TYPE VARCHAR2(2000); -- 构建 数据类型V_COMMENT_SQL VARCHAR2(2000); -- 构建 添加字段注释的脚本
BEGINFOR X IN C_TABLES LOOPBEGIN -- 如果表存在则删除EXECUTE IMMEDIATE 'DROP TABLE DWD.'||X.TABLE_NAME ||' PURGE';EXCEPTION WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLERRM);END;-- 构建创建表的语句V_SQL := 'CREATE TABLE DWD.'||X.TABLE_NAME||'(';-- 遍历 列 游标FOR Y IN C_COLUMNS(X.TABLE_NAME) LOOPV_DATA_TYPE := Y.DATA_TYPE;-- 处理精度和小数(number)IF Y.DATA_PRECISION IS NOT NULL THENV_DATA_TYPE := V_DATA_TYPE||'('||Y.DATA_PRECISION;IF Y.DATA_SCALE IS NOT NULL THENV_DATA_TYPE := V_DATA_TYPE ||','||Y.DATA_SCALE;END IF;V_DATA_TYPE := V_DATA_TYPE||')';ELSEV_DATA_TYPE := V_DATA_TYPE||'('||Y.DATA_LENGTH||')';IF Y.DATA_TYPE = 'CHAR' THENV_DATA_TYPE := 'VARCHAR2('||Y.DATA_LENGTH||')';--DBMS_OUTPUT.PUT_LINE('VARCHAR2('||Y.DATA_LENGTH||')');END IF;IF Y.DATA_TYPE IN ('DATE','TIMESTAMP') THENV_DATA_TYPE := 'VARCHAR2(200)';END IF;END IF;V_SQL := V_SQL||Y.COLUMN_NAME||' '||V_DATA_TYPE;V_SQL := V_SQL ||',';END LOOP;V_SQL := SUBSTR(V_SQL,1,LENGTH(V_SQL)-1);V_SQL := V_SQL||')';-- DBMS_OUTPUT.PUT_LINE(V_SQL);EXECUTE IMMEDIATE V_SQL;-- 给字段添加注释FOR V IN C_COL_COMMENTS(X.TABLE_NAME) LOOPV_COMMENT_SQL := 'COMMENT ON COLUMN DWD.'||X.TABLE_NAME||'.'||V.COLUMN_NAME||' IS' ||''''||V.COMMENTS||'''';EXECUTE IMMEDIATE V_COMMENT_SQL;END LOOP;END LOOP;END;

注: PLSQL的分析参照ODS层的建表PLSQL

和ODS建表PLSQL的不同之处

1.用户名

2.多了一个if 语句来把char类型变成varchar2类型

3.多一个if 语句把时间类型变成varchar2字符串类型

插入数据

--  ODS 数据到 DWD 

DECLARE-- 获取ODS用户的表名CURSOR C_TABLES IS  SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = 'ODS';-- 获取ODS用户下所有表的字段CURSOR C_COLUMNS (P_TABLE VARCHAR2) ISSELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALEFROM DBA_TAB_COLUMNS WHERE OWNER = 'ODS' AND TABLE_NAME = P_TABLE ORDER BY COLUMN_ID;--定义变量COL_LIST VARCHAR2(4000);---用于存储字段列表CHAR_COL VARCHAR2(4000);---用于处理数据类型和格式的转换IS_FIRST_COL BOOLEAN := TRUE;  ---用于判断是否是第一个字段V_SQL VARCHAR2(4000);  ---------用于存储建表sqlBEGIN----外循环获取ODS的表名FOR X IN C_TABLES LOOPCOL_LIST := '';IS_FIRST_COL := TRUE;----内循环遍历当前表的所有字段且进行数据类型及日期格式的转换FOR Y IN C_COLUMNS(X.TABLE_NAME) LOOPIF Y.DATA_TYPE = 'CHAR' THEN   CHAR_COL := 'TRIM('||Y.COLUMN_NAME||')';  ELSIF Y.DATA_TYPE IN ('DATE','TIMESTAMP') THENCHAR_COL := 'TO_CHAR('||Y.COLUMN_NAME||','||''''||'YYYYMMDD'||''''||')';ELSECHAR_COL := Y.COLUMN_NAME;END IF;----定义COL_LIST字段的拼接条件IF IS_FIRST_COL THENCOL_LIST := COL_LIST||CHAR_COL;IS_FIRST_COL := FALSE;---------不重新赋值无法进入else子语句ELSECOL_LIST := COL_LIST||','||CHAR_COL;END IF;END LOOP;V_SQL := 'INSERT INTO DWD.'||X.TABLE_NAME||' SELECT '||COL_LIST||' FROM ODS.'||X.TABLE_NAME;-- DBMS_OUTPUT.PUT_LINE(V_SQL);  ----输出拼接的插入sql进行检查,检查后注释掉EXECUTE IMMEDIATE V_SQL;     ----动态执行V_SQLCOMMIT; ----提交事务END LOOP;END;

为什么需要重新赋值 IS_FIRST_COL := FALSE;

在PL/SQL中,布尔变量的值不会自动改变,必须通过显式的赋值操作来更新其状态。如果不写 IS_FIRST_COL := FALSE;IS_FIRST_COL 的值将始终保持为初始值 TRUE,导致逻辑无法正确切换到后续字段的处理逻辑。

特殊的分区表和拉链表

如果是大量的分区表和拉链表>>修改建表PLSQL

如果是大量的普通表里面夹杂着一两个分区表和拉链表>>注释掉建表PLSQL的动态执行语句, 解除输出语句的注释, 批量输出建表语句, 复制到oracle的SQL执行区域, 找到要建分区表/拉链表的那张表>>修改建表语句>>执行

     DBMS_OUTPUT.PUT_LINE(V_SQL);---EXECUTE IMMEDIATE V_SQL;

实操示例2

 因为数据源DB也在oracle数据库, 也可以选择在ODS层就对数据进行数据清洗操作

建表----数据类型转换

DECLAREv_sql           VARCHAR2(4000);v_comment_sql   VARCHAR2(4000);v_data_type     VARCHAR2(100);-- 获取DB用户下的所有表CURSOR c_tables ISSELECT table_nameFROM dba_tablesWHERE owner = 'DB';-- 获取指定表的列信息CURSOR c_columns (p_table_name VARCHAR2) ISSELECT column_name,data_type,data_length,data_precision,data_scale,nullableFROM dba_tab_columnsWHERE owner = 'DB'AND table_name = p_table_nameORDER BY column_id;-- 获取列注释CURSOR c_col_comments (p_table_name VARCHAR2) ISSELECT column_name, commentsFROM dba_col_commentsWHERE owner = 'DB'AND table_name = p_table_name;BEGINFOR t IN c_tables LOOP-- 删除ODS用户下的表(如果存在)BEGINEXECUTE IMMEDIATE 'DROP TABLE ODS.' || t.table_name || ' PURGE';EXCEPTIONWHEN OTHERS THENIF SQLCODE != -942 THENRAISE;END IF;END;-- 构建CREATE TABLE语句v_sql := 'CREATE TABLE ODS.' || t.table_name || ' (';FOR c IN c_columns(t.table_name) LOOP-- 替换数据类型IF c.data_type = 'CHAR' THENv_data_type := 'VARCHAR2(' || c.data_length || ')';ELSIF c.data_type = 'TIMESTAMP' THENv_data_type := 'DATE';ELSEv_data_type := c.data_type;-- 处理精度和小数位(如NUMBER)IF c.data_precision IS NOT NULL THENv_data_type := v_data_type || '(' || c.data_precision;IF c.data_scale IS NOT NULL THENv_data_type := v_data_type || ',' || c.data_scale;END IF;v_data_type := v_data_type || ')';ELSIF c.data_type IN ('VARCHAR2', 'NVARCHAR2', 'RAW') THENv_data_type := v_data_type || '(' || c.data_length || ')';END IF;END IF;-- 拼接列定义v_sql := v_sql || c.column_name || ' ' || v_data_type;-- 处理NOT NULL约束IF c.nullable = 'N' THENv_sql := v_sql || ' NOT NULL';END IF;v_sql := v_sql || ', ';END LOOP;-- 完成CREATE TABLE语句v_sql := RTRIM(v_sql, ', ') || ')';EXECUTE IMMEDIATE v_sql;-- 添加字段注释FOR com IN c_col_comments(t.table_name) LOOPv_comment_sql := 'COMMENT ON COLUMN ODS.' || t.table_name || '.' || com.column_name ||' IS ''' || REPLACE(COALESCE(com.comments, '暂无注释'), '''', '''''') || '''';EXECUTE IMMEDIATE v_comment_sql;END LOOP;END LOOP;
END;

插入数据----去空格

DECLARE-- 获取DB用户所有的表CURSOR c_tables ISSELECT table_nameFROM dba_tablesWHERE owner = 'DB';-- 获取每张表中的字段名和数据类型CURSOR c_columns (p_table_name VARCHAR2) ISSELECT column_name,data_typeFROM dba_tab_columnsWHERE owner = 'DB'AND table_name = p_table_nameORDER BY column_id;col_list VARCHAR(2000); -- 存放字段   char_col VARCHAR2(2000); -- 存放char类型的字段 v_sql VARCHAR2(2000); -- 最后需要动态执行的sql语句first_column BOOLEAN := TRUE; -- 用于标记是否为第一个字段
BEGIN-- 遍历所有的DB表名FOR tab IN c_tables LOOP --DBMS_OUTPUT.PUT_LINE(tab.table_name);-- 表名作为参数传进c_columns游标 进行遍历col_list := '';first_column := TRUE;FOR col IN c_columns(tab.table_name) LOOPIF col.data_type = 'CHAR' THEN -- 类型为char则为字段添加trim函数char_col := 'TRIM('||col.column_name||')';ELSEchar_col := col.column_name;END IF;IF first_column THENcol_list := char_col; -- 首次拼接不添加逗号first_column := FALSE;ELSEcol_list := col_list||','||char_col; -- 非首次拼接添加逗号END IF;END LOOP;v_sql := 'INSERT INTO ODS.'||tab.table_name||' SELECT '||col_list||' FROM DB.'||tab.table_name;-- DBMS_OUTPUT.PUT_LINE(v_sql);EXECUTE IMMEDIATE v_sql;END LOOP;
END;

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

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

相关文章

2.1 第一个程序:从 Hello World 开始

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 同大多数编程语言教程一样,本书第一个代码也是输出:Hello world! 这似乎也是惯例。我们也先从这个简单的代码…

2025年02月21日Github流行趋势

项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 配置

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版(如 Ubuntu 20.04)查看和设置 WS…

7.建立文件版题库|编写model文件|使用boost split字符串切分(C++)

建立文件版题库 题目的编号题目的标题题目的难度题目的描述,题面时间要求(内部处理)空间要求(内部处理) 两批文件构成第一个:questions.list : 题目列表(不需要题目的内容)第二个:题目的描述,题目的预设置…

LabVIEW中CFURL.llb 工具库说明

CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库,主要用于处理 LabVIEW 与 URL 相关的操作,涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块,帮助开发者…

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置(IP二层VLAN链路聚合)ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

6.✨Python学习价值与优势分析

✨Python 是一种值得深入学习的编程语言,其设计哲学、广泛的应用场景以及强大的社区支持使其成为当今最受欢迎的编程语言之一。以下从多个角度分析为什么 Python 值得深入学习: 1.🦋 简洁易学的语法 Python 以简洁、可读性强著称&#xff0c…

Android Audio其他——数字音频接口(附)

数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。 一、音频链路 1、模拟音频信号 可以看到在传统的…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…

2.3 变量

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 变量是用来存放某个值的数据,它可以表示一个数字、一个字符串、一个结构、一个类等。变量包含名称、类型和值。在代码中…

LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师

背景 前面的文章通过 Ollama 私有化部署了 Qwen2.5 (7B) 模型,然后使用 Docker Compose 一键部署了 Dify 社区版平台。 LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库:在 Dify 平台上,通过普通编排的方式,创建了基于…

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…

工程师 - VSCode的AI编码插件介绍: MarsCode

豆包 MarsCode MarsCode AI: Coding Assistant Code and Innovate Faster with AI 豆包 MarsCode - 编程助手 安装完成并使能后,会在下方状态栏上显示MarsCode AI。 安装完并重启VSCode后,要使用这个插件,需要注册一下账号。然后授权VSCod…

DPVS-5: 后端服务监控原理与测试

后端监控原理 被动监测 DPVS自带了被动监控,通过监控后端服务对外部请求的响应情况,判断服务器是否可用。 DPVS的被动监测,并不能获取后端服务器的详细情况,仅仅通过丢包/拒绝情况来发觉后端服务是否可用。 TCP session state…

Tag标签的使用

一个非常适合运用在vue项目中的组件:Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网,搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组,…

算法-图-数据结构(邻接矩阵)-BFS广度优先遍历

邻接矩阵广度优先遍历(BFS)是一种用于遍历或搜索图的算法,以下是具体介绍: 1. 基本概念 图是一种非线性的数据结构,由顶点和边组成,可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数…

Ryu:轻量开源,开启 SDN 新程

1. Ryu 控制器概述 定位:轻量级、开源的SDN控制器,专为开发者和研究人员设计,基于Python实现。开发者:由日本NTT实验室主导开发,遵循Apache 2.0开源协议。核心理念:简化SDN应用开发,提供友好的…

内容中台架构下智能推荐系统的算法优化与分发策略

内容概要 在数字化内容生态中,智能推荐系统作为内容中台的核心引擎,承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开,通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…

【odoo18-文件管理】在uniapp上访问odoo系统上的图片

在uniapp上访问odoo系统上的图片 1、以url的形式访问 a:以odoo本身的域名,比如http://127.0.0.1:8069/web/image/product.template/3/image_128?unique1740380422000,这种方式需要解决跨域的问题。 b:以文件服务器的形式&…

DeepSeek掘金——基于DeepSeek-R1构建文档问答机器人

DeepSeek掘金——基于DeepSeek-R1构建文档问答机器人 在这个项目中,我们将结合本地 AI 的隐私与 Deepseek R1 的智能,创建一个完全本地化、推理驱动的问答机器人。 在人工智能 (AI) 日益融入我们日常生活的时代,一个问题仍然处于最前沿:隐私。尽管基于云的 AI 系统功能强大…