助力工业物联网,工业大数据之ODS层构建:代码结构及修改【九】

news2024/11/18 7:24:59

文章目录

    • 01:ODS层构建:代码结构及修改
    • 02:ODS层构建:连接代码及测试
    • 03:ODS层构建:建库代码及测试
    • 04:ODS层构建:建表代码及测试

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

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

  • 路径

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

    • 工程代码结构

      image-20211009173309532

  • 代码模块功能

    • 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层的表的名称
  • 代码配置修改

    • 修改1:auto_create_hive_table.cn.itcast.EntranceApp.py
      # 51行:修改为你实际的项目路径对应的表名文件
    tableList = FileUtil.readFileContent("D:\\PythonProject\\OneMake_Spark\\dw\\ods\\meta_data\\tablenames.txt")
    
    • 修改2:auto_create_hive_table.cn.itcast.utils.ConfigLoader
    # 10行:修改为实际的连接属性配置文件的地址
    config.read('D:\\PythonProject\\OneMake_Spark\\auto_create_hive_table\\resources\\config.txt')
    
  • 小结

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

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

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

  • 路径

    • step1:连接代码讲解
    • step2:连接代码测试
  • 实施

    • 为什么要获取连接?

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

    • 连接代码讲解

      • step1:怎么获取连接?

        • Oracle:安装Python操作Oracle库包:cx_Oracle

          cx_Oracle.connect(ORACLE_USER, ORACLE_PASSWORD, dsn)
          
        • Hive/SparkSQL:安装Python操作Hive库包:PyHive

          ```
          hive.Connection(host=SPARK_HIVE_HOST, port=SPARK_HIVE_PORT, username=SPARK_HIVE_UNAME, auth='CUSTOM', password=SPARK_HIVE_PASSWORD)
          ```
          
          • step2:连接时需要哪些参数?

            • Oracle:主机名、端口、用户名、密码、SID
            • Hive:主机名、端口、用户名、密码
          • step3:如果有100个代码都需要构建Hive连接,怎么解决呢?

            • 将所有连接参数写入一个配置文件:resource/config.txt
            • 通过配置文件的工具类获取配置:ConfigLoader
          • step4:在ODS层建101张表,表名怎么动态获取呢?

            • 读取表名文件:将每张表的名称都存储在一个列表中
          • step5:ODS层的表分为全量表与增量表,怎么区分呢?

            • 通过对@符号的分割,将全量表和增量表的表名存储在不同的列表中
    • 连接代码测试

      • 启动虚拟运行环境

        image-20210930160404445

      • 运行测试代码

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

        image-20211009151713201

  • 小结

    • 阅读连接代码及实现连接代码测试

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

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

  • 路径

    • step1:代码讲解
    • step2:代码测试
  • 实施

    • 代码讲解

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

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

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

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

      image-20211009153910448

  • 小结

    • 阅读ODS建库代码及实现测试

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

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

  • 路径

    • step1:代码讲解
    • step2:代码测试
  • 实施

    • 代码讲解

      • step1:表名怎么获取?

        tableNameList【full_list,incr_list】
        full_list:全量表名的列表
        incr_list:增量表名的列表
        
      • step2:建表的语句是什么,哪些是动态变化的?

        create external table 数据库名称.表名
        comment '表的注释'
        partitioned by
        ROW FORMAT SERDE
          'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
        STORED AS INPUTFORMAT
          'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
        OUTPUTFORMAT
          'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
        location '这张表在HDFS上的路径'
        TBLPROPERTIES ('这张表的Schema文件在HDFS上的路径'
        • 表名

        • 表的注释

        • 表的HDFS地址

        • Schema文件的HDFS地址

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

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

          select
                 columnName, dataType, dataScale, dataPercision, columnComment, tableComment
          from
          (
              select
                     column_name columnName,
                     data_type dataType,
                     DATA_SCALE dataScale,
                     DATA_PRECISION dataPercision,
                     TABLE_NAME
              from all_tab_cols where 'CISS_CSP_WORKORDER' = table_name) t1
              left join (
                  select
                         comments tableComment,TABLE_NAME
                  from all_tab_comments WHERE 'CISS_CSP_WORKORDER' = TABLE_NAME) t2
                  on t1.TABLE_NAME = t2.TABLE_NAME
              left join (
                  select comments columnComment, COLUMN_NAME
                  from all_col_comments WHERE TABLE_NAME='CISS_CSP_WORKORDER') t3
                  on t1.columnName = t3.COLUMN_NAME;
          

          image-20211009154553669

      • 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阶段的内容
      • 运行代码,查看结果

      image-20211009162716532

  • 小结

    • 阅读ODS建表代码及实现测试

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

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

相关文章

漏扫常见(可验证)漏洞复现方法

SSL/TLS协议信息泄露漏洞(CVE-2016-2183) 检测到目标服务支持SSL弱加密算法 检测到目标服务支持SSL中等强度加密算法 nmap -sV -p 端口 --script ssl-enum-ciphers 目标ipSSH支持弱加密算法 nmap -sV -p 端口 --script ssh2-enum-algos 目标ipApache Tomcat示例脚本信息泄露…

YOLOv8 更换主干网络之 ShuffleNetv2

《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》 目前,神经网络架构设计多以计算复杂度的间接度量——FLOPs为指导。然而,直接的度量,如速度,也取决于其他因素,如内存访问成本和平台特性。因此,这项工作建议评估目标平台上的直接度量,而…

Vue 表单

文章目录 Vue 表单输入框复选框单选按钮select 列表修饰符.lazy.number.trim Vue 表单 这节为大家介绍 Vue.js 表单上的应用。 你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 输入框 v-model 会根据控件类型自动选取正确的方法来更新元素。 输入框 实例中演示…

Maven(二)高级操作

目录 一、分模块开发与涉及(重点)1.工程模块划分2.modules_common拆分3.modules_pojo拆分4.modules_dao拆分5.modules_service拆分6.modules_controller拆分7.总结 二、聚合(重点)1.多模块构建维护2.聚合 三、继承(重点…

HTML5 <param> 标签、HTML5 <progress> 标签

HTML5 <param> 标签 实例 HTML5 <param>标签为<object>标签提供嵌入内容的运行时参数的name与value对。请参考下述示例&#xff1a; 设置参数 "autoplay" 为 "true"&#xff0c;音频载入后会自动播放&#xff1a; <object data&qu…

基于AT89C51单片机的电子时钟设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87695258?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 1.设计出电子数字钟的电路&#xff0c;并用protus进行仿真画出对应的电路图 2.设计出电子数字钟…

2021地理设计组二等奖:基于GIS的东江源区土壤侵蚀及其影响因素空间分析

一、作品背景 水土保持情况普查对我国具有重要意义。我国目前是世界上水土流失最严重的国家之一&#xff0c;水土流失面积极其广且量大&#xff1b;严重的水土流失问题是我国生态环境问题的重要板块&#xff0c;若是持续恶化&#xff0c;将会严重影响我国的生态安全、饮水安全…

不得不说的创建型模式-抽象工厂模式

抽象工厂模式是一种创建型模式&#xff0c;它提供一个接口来创建一系列相关或相互依赖的对象&#xff0c;而不需要指定它们的具体类。这个接口被称为“抽象工厂”&#xff0c;它可以被不同的具体工厂实现来创建不同的产品族。 下面通过一个简单的示例来说明抽象工厂模式的底层原…

[API]string常量池string常用方法StringBuilder类(一)

String字符串类型&#xff1a; java.lang.String类使用final修饰&#xff0c;不能被继承 String的底层封装的是一个字符数组 String在内存中采用Unicode编码格式&#xff0c;每个字符占用2个字节的内存空间 字符串对象一旦创建&#xff0c;对象内容永远无法改变&#xff0c;…

Python爬虫实战——下载小说

Python爬虫实战——下载小说 前言第三方库的安装示例代码效果演示结尾 前言 使用requests库下载开源网站的小说 注意&#xff1a;本文仅用于学习交流&#xff0c;禁止用于盈利或侵权行为。 操作系统&#xff1a;windows10 家庭版 开发环境&#xff1a;Pycharm Conmunity 202…

Node【NPM】

文章目录 &#x1f31f;前言&#x1f31f;NPM使用&#x1f31f;NPM使用场景&#x1f31f;NPM的常用命令&#x1f31f;NPM命令使用介绍&#x1f31f; 使用NPM安装模块&#x1f31f; 下载三方包&#x1f31f; 全局安装VS本地安装&#x1f31f; 本地安装&#x1f31f; 全局安装&am…

Vue全家桶

作为后端对vue学习完的快速总结 目录 1.vue-cli 2 vuex 3 axios 4 router vue-cli vue-cli 3 是基于webpack 4 打造的vue-cli 2 还是 webpack 3webpack是基于node.js的&#xff0c;所以我们在安装脚手架前必须安装node 安装node.js(应用商店或者官网) 1.安装vue脚手架 npm…

Storm proxies动态代理IP抓取产品信息用什么类型的代理呢?

抓取产品信息时&#xff0c;可以根据实际需求和目标网站的反爬虫策略选择合适的代理类型。以下是一些常见的代理类型&#xff1a; HTTP代理&#xff1a;HTTP代理是最常见的代理类型&#xff0c;适用于基于HTTP协议的网站。它可以用于发送HTTP请求和接收HTTP响应&#xff0c;适合…

storm proxies动态HTTP代理IP的三大功能?

动态HTTP代理IP主要具有以下三大功能&#xff1a; 隐私保护&#xff1a;动态HTTP代理IP可以隐藏用户的真实IP地址&#xff0c;将用户的请求发送到目标网站时&#xff0c;目标网站只能看到代理IP地址&#xff0c;而无法知道用户的真实IP地址&#xff0c;从而保护用户的隐私和身份…

665. 非递减数列

给你一个长度为 n 的整数数组 nums &#xff0c;请你判断在 最多 改变 1 个元素的情况下&#xff0c;该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的&#xff1a; 对于数组中任意的 i (0 < i < n-2)&#xff0c;总满足 nums[i] < nums[i 1]。 示例…

第四章(1):词向量定义与意义

第四章&#xff08;1&#xff09;&#xff1a;词向量定义与意义 目录 第四章&#xff08;1&#xff09;&#xff1a;词向量定义与意义前言1. 词的表示1.1 离散表示1.1.1 One-Hot独热编码1.1.2 ngram特征表示 1.2 分布式表示 2. 意义 前言 在自然语言处理的领域中&#xff0c;每…

电容-基础知识

1、电容两端电压 不能激变&#xff0c;所以可以起到稳定电压作用 2、电容的种类&#xff1a;瓷片电容、插件电解电容、贴片电解电容、钽电容、CBB电容、插件瓷片电容、&#xff08;X电容、Y电容&#xff0c;属于安规电容&#xff0c;对功能没有影响&#xff0c;对性能没有影响…

权限控制_SpringSecurity

认证-授权 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。 授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就是指定当前用户可以操作…

【Qt】随记1:#if 1/0 #else #endif的用法

欢迎阅读本博文&#xff0c;本文主要记录Qt学习、工作中的一些注意点及相关笔记&#x1f4c3; 希望记录的内容有帮助到你&#xff0c;也欢迎把你知道的分享给大家&#xff0c;一起进步&#xff01;&#x1f389; 喜欢的话&#xff0c;请帮忙点赞&#x1f44d;、评论&#x1f4…

【排序】快速排序(递归和非递归)

快速排序 前言图解大致思路对于hoare版本对于挖坑法对于前后指针法 实现方法递归非递归 快排的优化&#xff08;基于递归的优化&#xff09;三数取中法小区间优化 时间复杂度和空间复杂度 前言 快速排序&#xff0c;听名字就比较霸道&#xff0c;效率根名字一样&#xff0c;非…