Hive+Spark离线数仓工业项目--ODS层及DWD层构建(2)

news2025/1/17 3:14:29

ODS层构建:代码导入

目标:实现Python项目代码的导入及配置

实施

  Oracle本地驱动目录**:将提供的**instantclient_12_2**目录放入D盘的根目录下

 PyHive本地连接配置:将提供的CMU目录放入C盘的根目录下

auto_create_hive_table包

    创建路径包

 

      - 在datatohive的init文件中放入如下代码

      - 其他包的init都放入如下内容

将对应的代码文件放入对应的包或者目录中

      step1:从提供的代码中复制config、log、resource这三个目录直接粘贴到**auto_create_hive_table**包下

      step2:从提供的代码中复制entity、utils、EntranceApp.py这三个直接粘贴到**itcast**包下

  step3:从提供的代码中复制fileformat等文件直接粘贴到**datatohive**包下

 DW归档目录:将提供的代码中的dw目录直接粘贴到项目中

 ODS层构建:代码结构及修改

目标:了解整个自动化代码的项目结构及实现配置修改

路径

  - step1:工程代码结构
  - step2:代码模块功能
  - step3:代码配置修改

实施

工程代码结构

代码模块功能

    - `auto_create_hive_table`:用于实现ODS层与DWD层的建库建表的代码

      - `cn.itcast`
  
        - `datatohive`
  
          - CHiveTableFromOracleTable.py:用于创建Hive数据库、以及获取Oracle表的信息创建Hive表等
          - CreateMetaCommon.py:定义了建表时固定的一些字符串数据,数据库名称、分层名称、文件类型属性等
          - CreateHiveTablePartition.py:用于手动申明ODS层表的分区元数据
          - LoadData2DWD.py:用于实现将ODS层的数据insert到DWD层表中
          - `fileformat`
          - AvroTableProperties.py:Avro文件格式对象,用于封装Avro建表时的字符串
            - OrcTableProperties.py:Orc文件格式对象,用于封装Orc建表时的字符串
          - OrcSnappyTableProperties.py:Orc文件格式加Snappy压缩的对象
            - TableProperties.py:用于获取表的属性的类
  
      - `entity`
  
        - TableMeta.py:Oracle表的信息对象:用于将表的名称、列的信息、表的注释进行封装
          - ColumnMeta.py:Oracle列的信息对象:用于将列的名称、类型、注释进行封装
  
        - `utils`
  
          - OracleHiveUtil.py:用于获取Oracle连接、Hive连接
        - FileUtil.py:用于读写文件,获取所有Oracle表的名称
          - TableNameUtil.py:用于将全量表和增量表的名称放入不同的列表中
        - ConfigLoader.py:用于加载配置文件,获取配置文件信息
          - OracleMetaUtil.py:用于获取Oracle中表的信息:表名、字段名、类型、注释等
  
        - **EntranceApp.py**:程序运行入口,核心调度运行的程序
  
          # todo:1-获取Oracle、Hive连接,获取所有表名
          # todo:2-创建ODS层数据库
          # todo:3-创建ODS层数据表
          # todo:4-手动申明ODS层分区数据
        # todo:5-创建DWD层数据库以及数据表
          # todo:6-加载ODS层数据到DWD层
        # todo:7-关闭连接,释放资源
          ```

      - `resource`

        - config.txt:Oracle、Hive、SparkSQL的地址、端口、用户名、密码配置文件
  
    - `config`
  
      - common.py:用于获取日志的类
        - settings.py:用于配置日志记录方式的类

      - `log`

        - itcast.log:日志文件

    - `dw`:用于存储每一层构建的核心配置文件等

      - 重点关注:**dw.ods.meta_data.tablenames.txt**:存储了整个ODS层的表的名称

ODS层构建:连接代码及测试

目标:阅读连接代码及实现连接代码测试

路径

  - step1:连接代码讲解
  - step2:连接代码测试

实施

  - **为什么要获取连接?**

    - Python连接Oracle:获取表的元数据
    - 表的信息:TableMeta
        - 表名
      - 表的注释
        - list:[列的信息]
    - 列的信息:ColumnMeta
        - 列名
      - 列的注释
        - 列的类型
      - 类型长度
        - 类型精度
  - Python连接HiveServer或者Spark的ThriftServer:提交SQL语句    
连接代码讲解

    - step1:怎么获取连接?

 step2:连接时需要哪些参数?

      - Oracle:主机名、端口、用户名、密码、SID
      - Hive:主机名、端口、用户名、密码

    - step3:如果有100个代码都需要构建Hive连接,怎么解决呢?

      - 将所有连接参数写入一个配置文件:resource/config.txt
      - 通过配置文件的工具类获取配置:ConfigLoader

    - step4:在ODS层建101张表,表名怎么动态获取呢?

      - 读取表名文件:将每张表的名称都存储在一个列表中

    - step5:ODS层的表分为全量表与增量表,怎么区分呢?

      - 通过对@符号的分割,将全量表和增量表的表名存储在不同的列表中

  连接代码测试

    - 启动虚拟运行环境

  运行测试代码

      - 注释掉第2 ~ 第6阶段的内容
      - 取消测试代码的注释
      - 执行代码观察结果

      

ODS层构建:建库代码及测试

目标:阅读ODS建库代码及实现测试

路径

  - step1:代码讲解
  - step2:代码测试

实施

代码讲解

    step1:ODS层的数据库名称叫什么?

  step2:如何使用PyHive创建数据库?

      - 第一步:先获取连接
      - 第二步:拼接SQL语句,从连接对象中获取一个游标
      - 第三步:使用游标执行SQL语句
      - 第四步:释放资源

  - **代码测试**
    - 注释掉第3 ~ 第6阶段的内容
    - 运行代码,查看结果

    

    ODS层构建:建表代码及测试

目标:阅读ODS建表代码及实现测试

路径

  - step1:代码讲解
  - step2:代码测试

实施

 代码讲解

    - step1:表名怎么获取?
      tableNameList【full_list,incr_list】
      full_list:全量表名的列表
      incr_list:增量表名的列表

    - step2:建表的语句是什么,哪些是动态变化的?

 

      - 表名
      - 表的注释

      - 表的HDFS地址
      - Schema文件的HDFS地址

    - step3:怎么获取表的注释?

      - 从Oracle中获取:从系统表中获取某张表的信息和列的信息

 step4:全量表与增量表有什么区别?

      - 区别1:表名不一样
        - full_table_list
        - incr_table_list
      - 区别2:路径不一样
        - `/data  /dw  /ods /one_make /full  /Oracle库名.表名`
        - `/data  /dw  /ods /one_make /incr  /Oracle库名.表名`

    - step5:如何实现自动化建表?

      - 自动化创建全量表
        - 获取全量表名
        - 调用建表方法:数据库名称、表名、全量标记
        - 通过Oracle工具类获取表的信息【表的名称、表的注释、字段信息等】
        - 拼接建表语句
        - 执行SQL语句
      - 自动化创建增量表
        - 获取增量表名
        - 调用建表方法:数据库名称、表名、增量标记
        - 通过Oracle工具类获取表的信息【表的名称、表的注释、字段信息等】
        - 拼接建表语句
        - 执行SQL语句

  代码测试

    - 注释掉第4~ 第6阶段的内容
    - 运行代码,查看结果
    
    

 ODS层构建:申明分区代码及测试

目标:阅读ODS申明分区的代码及实现测试

路径

  - step1:代码讲解
  - step2:代码测试

实施

代码讲解

step1:为什么要申明分区?

      - 表的分区数据由Sqoop采集到HDFS生成AVRO文件

      - HiveSQL基于表的目录实现了分区表的创建

 但是Hive中没有对应分区的元数据,无法查询到数据

 step3:如何自动化实现每个表的分区的申明?

      - 获取分区工具类实例
      - 调用申明分区的方法
        - 对所有全量表调用申明分区的方法:数据库名称、表名、全量标记、分区值
        - 对所有增量表调用申明分区的方法:数据库名称、表名、增量标记、分区值
      - 拼接SQL
      - 执行SQL

  - **代码测试**

    - 注释掉第5 ~ 第6阶段的内容
  - 运行代码,查看结果
  

ODS层与DWD层区别

目标:理解ODS层与DWD层的区别

路径

  - step1:内容区别
  - step2:设计区别
  - step3:实现区别

实施

 内容区别

    - ODS:原始数据
    - DWD:对ODS层ETL以后的数据
    - 本次数据来源于Oracle数据库,没有具体的ETL的需求,可以直接将ODS层的数据写入DWD层

 设计区别

    - ODS层:Avro格式分区数据表
    - DWD层:Orc格式分区数据表

  实现区别

    - ODS层建表:基于avsc文件指定Schema建表

    - DWD层建表:自己指定每个字段的Schema建表

 DWD层构建:需求分析

目标:掌握DWD层的构建需求
路径
  - step1:整体需求
  - step2:建库需求
  - step3:建表需求
实施
整体需求:将ODS层的数据表直接加载到DWD层
  

  
建库需求:创建DWD层数据库one_make_dwd
  
建表需求:将ODS层中的每一张表创建一张对应的DWD层的表
    
    - 问题1:建表的语法是什么?

    
    - 问题2:表的名称名是什么,怎么获取?
    
      - 不分全量和增量
      - 所有表的名称都在列表中
    
    - 问题3:表的注释怎么来?
    
      - Oracle元数据中有
    
    - 问题4:表的字段怎么获取?
    
      - Oracle元数据中有
    
    - 问题5:Oracle中的字段类型如果与Hive中的类型不一致怎么办?
    
      - 将Oracle中Hive没有类型转换为Hive的类型

DWD层构建:建库实现测试

目标:阅读DWD建库代码及实现测试
路径
  - step1:代码讲解
  - step2:代码测试
实施
  代码讲解

    - step1:DWD层的数据库名称是什么,建库的语法是什么?

    - step2:如何实现DWD层数据库的构建?

  - **代码测试**

    - 注释掉第5.2 ~ 第6阶段的内容
    
    - 运行代码,查看结果

      
DWD层构建:建表实现测试

目标:阅读DWD建表代码及实现测试

路径

  - step1:代码讲解
  - step2:代码测试

实施

  代码讲解

    - step1:如何获取所有表名?

      - 列表推导式

    - step2:建表的语句是什么,哪些是动态变化的?

      - 动态变化的信息如下:
        - 表名,表的注释
        - 字段
        - 路径

    - step3:怎么获取字段信息?

    - step4:Oracle字段类型与Hive/SparkSQL字段类型不一致怎么办?

      - timestamp => long 
      - number => bigint | dicimal
      - other => String

    - step4:HDFS上的路径是什么?

      ```
      /data/dw/dwd/one_make/tableName
      ```

    - step5:如何实现自动化

      - 遍历表名,对每张表调用自动化建表的方法:数据库名称、表的名称、None【不分全量或者增量】
      - 从Oracle中获取字段名,并实现类型转换
      - 添加表的注释、分区信息
      - 添加表的存储格式
      - 指定表的存储路径
      - 执行SQL语句

  - **代码测试**

    - 注释掉 第6阶段的内容
    
    - 运行代码,查看结果
    
      

DWD层构建:数据抽取分析

目标:实现DWD层的构建思路分析

路径

  - step1:抽取目标
  - step2:抽取语法

实施

  抽取目标:将ODS层中每张表的数据抽取到DWD层对应的数据表中

  抽取语法

DWD层构建:数据抽取测试

目标:实现DWD层数据抽取的测试
路径
  - step1:代码讲解
  - step2:代码测试
实施
代码讲解
    - step1:如何获取所有表名?
      - 所有表名都在list中
    - step2:如何获取所有字段的信息?
      - 从Oracle中获取
  - **代码测试**
    - 取消第6段代码的注释
    - 运行代码,查看结果
 

整体代码重难点回顾

目标:掌握整体代码的重难点
实施
  - 问题1:怎么读取表名的?
    - 表名:文件
    - FileUitil:读取文件
    - TableNameUtil:将表名拆分全量列表和增量列表
  - 问题2:怎么构建连接的?
    - Oracle:cx_Oracle
      - conn(hostname,port,username,password,sid)
    - Hive/SparkSQL:PyHive
      - conn(hostname,port,username,password)
    - 执行SQL规则
      - step1:必须构建一个连接
      - step2:从连接中获取游标,定义SQL
      - step3:使用游标执行SQL语句
      - step4:释放资源
  - 问题3:为什么要把连接地址写在文件里?
    - 开发规范
    - df.write.jdbc(url,table,properties)
      - 地址
      - 端口
      - 用户名
      - 密码
      - 表名
  - 问题4:怎么拼接SQL语句的?
    - 字符串的拼接
  - 问题5:怎么执行SQL语句的?
    - 游标:execute(SQL)
  - 问题6:怎么获取Oracle的表的信息的?
    - Oracle将每张表的每一列的信息都存储Oracle系统表中
      - 通过SQL就可以查询到表的这些信息
    - TableMeta:表的信息
      - 表名:String
      - 表的注释:String
      - 列的信息:List[ColumnMeta]
    - ColumnMeta:列的信息
      - 列名
      - 列注释
      - 列类型
      - 长度
      - 精度
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中的Map集合体系

Map集合体系Map集合的概述Map集合体系特点Map集合常用APIMap集合的遍历方式:方式一:键找值方式二:键值对方式三:lambda表达式Map集合的实现类HashMapMap集合的实现类TreeMap集合嵌套Map集合的概述 Map集合概述和使用:…

Java 基础:变量、操作符、代码块和控制流

目录 一、变量:Variables 1、基本数据类型 2、数组 二、操作符/运算符 Operators 三、表达式、语句和代码块 四、程序控制流 一、变量:Variables Java 定义了以下几种变量: 实例变量/成员变量(非静态字段)&…

Docker+NETCore系列文章(五、推送自制镜像到Docker Hub、阿里云镜像仓库)

推送镜像到Docker Hub镜像仓库 1、访问Docker Hub:https://hub.docker.com/,注册并登陆Docker。 2、使用docker pull hello-world命令拉取hello-workld镜像。 [rootVM-0-6-centos ~]# docker pull hello-world Using default tag: latest latest: Pul…

微服务架构 VS 单体架构

在软件行业,微服务架构是一种重要的发展趋势。这一趋势,不仅仅是对企业内的IT信息系统建设,甚至在企业向数字化转型方面,都有着深远的影响。微服务架构与传统的单体软件架构代表着IT产业处理软件开发方式的一个根本性转变&#xf…

【C++11】异常

🌈1.C语言传统处理错误的方式 在讲解C的异常机制之前我们先来复习一下传统的处理错误的方式。 传统的错误处理机制: 1.终止程序、如assert , 缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。2.返回错误码、缺陷&…

Apache POI导入导出excel文件实战

文章目录前言技术栈1、引入依赖2、导入代码实现3、导出代码实现3.1、准备导出文件模板3.2、导出代码实现4、代码实现解释5、常见问题前言 这两天公司项目业务提出需求,要求在前端上传excel文件然后解析展示,因此写篇文章记录一下实现。 技术栈 spring…

抖音小程序实践三:接口开发指南

通过官方文档可以更系统的学习到所有的接口,我这边罗列一下我自己用到测试过的接口供大家参考。 前端-小程序对接官方文档:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info服务端-小…

个人黄金准备与须知

投资黄金可以为自己的资产保值,也可以福泽后人,因此十分符合国人传统文化特点和理财智慧。可是现在市场中可以投资黄金的平台那么多,投资者必须先认真“调查研究”,才能“去芜存菁”,选到值得托付的好平台。 其实投资者…

为笔记本电脑绑定公网IP随时随地BT做种完整方案(frp加v2ray配合比特彗星点亮绿灯)

BT做种需要拥有固定的IP(IPV4)和端口,如果想在拥有固定IP的服务端做种,可以直接参考前一期https://www.v2fy.com/p/2022-12-25-bt-1671963832000/ ,如果想使用笔记本随时随地做种,那就需要拥有固定IP的服务器进行流量转发。 本篇…

富特科技在创业板IPO过会:计划募资约9亿元,股东包括小米等

近日,深圳证券交易所披露的信息显示,浙江富特科技股份有限公司(下称“富特科技”)获得创业板上市委会议审核通过。据贝多财经了解,富特科技于2022年6月16日在创业板递交招股书。 本次冲刺创业板上市,富特科…

【聆思CSK6 视觉AI开发套件试用】头肩、手势识别体验与PWM舵机控制

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站。作者:酷电玩家 环境搭建 官方文档详细环境搭建教程:环境搭建 1、下载Git进行安装。 2、安装lisa zep工具,并初始化 CSK6…

洛谷千题详解 | P1026 [NOIP2001 提高组] 统计单词个数【C++、Java语言】

博主主页:Yu仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C源码: Java源码: C源码2: ----------------------------------------------------------------------------…

vector模板的简易实现

这篇文章,我们模拟一下STL里面的vector的实现。但是会简化一些内容,让大家能够更好的理解。模拟实现的目的不是为了更好的造轮子,而是为了更好的理解这些容器。 文章目录1. 成员变量2. push_back函数3. reserve函数4. pop_back函数和下标运算…

QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据 前言 我一开始的代码逻辑是,PCAN开启、关闭、发送、接收这些功能整合在一个工具类中,这个工具类的对象是在主线程创建的,然后我有一个要循环定时发送的功能是独立…

与企企通强强联手!哈尔斯二期数字化采购项目正式启动

近日,浙江哈尔斯真空器皿股份有限公司(以下简称“哈尔斯”)联合企企通举办二期数字化采购项目启动会,旨在助力哈尔斯实现采购数字化全面升级,提升自主品牌竞争力。会上,双方就该项目的建设方案、项目资源、…

铝合金表面处理废水除铝工艺

铝型材表面处理用水量大,产生废水多,废水中有害物质持续排放。如不加以处理必将污染环境。同时伴随着我国对排污量的征税,也会增加企业的成本和负担。因此,从企业的社会责任和效益两方面考虑,进行废水处理是必须和必要…

解决VsCode启动Vue项目报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题描述 最近居家办公,网速不太稳定,开会的时候网络也是断断续续的,今天需要拉下前端项目运行起来 在我执行npm i下载包的时候,我看到网络超时的错误警告就感觉不太秒。知道大概率要启动失败了 果不其然执行npm run serve的时…

窃取信息的新恶意软件通过假冒的破解网站感染使用者

©网络研究院 一种名为“RisePro”的新型信息窃取恶意软件正在通过由 PrivateLoader 按安装付费 (PPI) 恶意软件分发服务运营的虚假破解站点进行分发。 RisePro 旨在帮助攻击者从受感染的设备中窃取受害者的信用卡、密码和加密钱包。 本周Flashpoint 和 Sekoia的分析师发…

前端框架 Nuxt3 集成 Pinia

目录 一、Nuxt3集成Pinia 二、Pinia的使用 state的使用 1、基本使用及动态渲染 2、state的重置 3、批量更改state数据 getters的使用 1、getters的基本使用 2、getters传参 actions的使用 1、actions的基本使用 一、Nuxt3集成Pinia 参考官方文档:简介 |…

【JavaSE】常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期,以及各状态切换使用到的方法等 状态,方法 2.同步代码块中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解,以及注意点。 synchronized(同步监视器){//操…