当前位置: 首页 > news >正文

助力工业物联网,工业大数据之ODS层及DWD层建表语法【七】

文章目录

  • ODS层及DWD层构建
    • 01:课程回顾
    • 02:课程目标
    • 03:数仓分层回顾
    • 04:Hive建表语法
    • 05:Avro建表语法

ODS层及DWD层构建

01:课程回顾

  1. 一站制造项目的数仓设计为几层以及每一层的功能是什么?

    • ODS:原始数据层:存放从Oracle中同步采集的所有原始数据
    • DW:数据仓库层
      • DWD:明细数据层:存储ODS层进行ETL以后的数据
      • DWB:轻度汇总层:对DWD层的数据进行轻度聚合:关联和聚合
        • 基于每个主题构建主题事务事实表
      • DWS:维度数据层:对DWD层的数据进行维度抽取
        • 基于每个主题的维度需求抽取所有维度表
    • ST:数据应用层
      • 基于DWB和DWS的结果进行维度的聚合
    • DM:数据集市层
      • 用于归档存储公司所有部门需要的shuju
  2. 一站制造项目的数据来源是什么,核心的数据表有哪些?

    • 数据来源:业务系统
    • ERP:公司资产管理系统、财务数据
      • 工程师信息、零部件仓储信息
    • CISS:客户服务管理系统
      • 工单信息、站点信息、客户信息
    • 呼叫中心系统
      • 来电受理信息、回访信息
  3. 一站制造项目中在数据采集时遇到了什么问题,以及如何解决这个问题?

    • 技术选型:Sqoop
    • 问题:发现采集以后生成在HDFS上文件的行数与实际Oracle表中的数据行数不一样,多了
    • 原因:Sqoop默认将数据写入HDFS以普通文本格式存储,一旦遇到数据中如果包含了特殊字符\n,将一行的数据解析为多行
    • 解决
      • 方案一:Sqoop删除特殊字段、替换特殊字符【一般不用】
      • 方案二:更换其他数据文件存储类型:AVRO
        • 数据存储:Hive
        • 数据计算:SparkSQL
  4. 什么是Avro格式,有什么特点?

    • 二进制文本:读写性能更快
    • 独立的Schema:生成文件每一行所有列的信息
      • 对列的扩展非常友好
    • Spark与Hive都支持的类型
  5. 如何实现对多张表自动采集到HDFS?

    • 需求

      • 读取表名
      • 执行Sqoop命令
    • 效果:将所有增量和全量表的数据采集到HDFS上

      • 全量表路径:维度表:数据量、很少发生变化

        /data/dw/ods/one_make/   full_imp   /表名/分区/数据
        
      • 增量表路径:事实表:数据量不断新增,整体相对较大

        /data/dw/ods/one_make/    incr_imp  /表名/分区/数据
        
      • Schema文件的存储目录

        /data/dw/ods/one_make/avsc
        
    • Shell:业务简单,Linux命令支持

    • Python:业务复杂,是否Python开发接口

      • 调用了LinuxShell来运行
  6. Python面向对象的基本应用

    • 语法

      • 定义类

        class 类名:# 属性:变量# 方法:函数
        
      • 定义变量

        key = value
        
      • 定义方法

        def funName(参数):方法逻辑return
        
    • 面向对象:将所有事物以对象的形式进行编程,万物皆对象

      • 对象:是类的实例
    • 对象类:专门用于构造对象的,一般称为Bean,代表某一种实体Entity

      • 类的组成

        class 类名:# 属性:变量# 方法:函数
        
      • 业务:实现人购买商品

        • class Person:# 属性id = 1name = zhangsanage = 18gender = 1……# 方法def eat(self,something):print(f"{self.name} eating {something}")def buy(self,something)print(f"{self.name} buy {something}")
          
          • 每个人都是一个Person类的对象
        • 商品

          class Product:# 属性id = 001price = 1000.00size = middlecolor = blue……# 方法def changePrice(self,newPrice):self.price = newPirce
          
    • 工具类:专门用于封装一些工具方法的,utils,代表某种操作的集合

      • 类的组成:一般只有方法

        class 类名:# 方法:函数
        
      • 字符串处理工具类:拼接、裁剪、反转、长度、转大写、转小写、替换、查找

        class StringUtils:def concat(split,args*):split.join(args)def reverse(sourceString)return reverse(sourceString)……
        
      • 日期处理工具类:计算、转换

        class TimeUitls:def computeTime(time1,time2):return time1-time2def transTimestamp(timestamp):return newDateyyyy-MM-dd HH:mm:ss)def tranfData(date)return timestamp
        
    • 常量类:专门用于定义一些不会发生改变的变量的类

      • 类的组成:一般只有属性

        class 类名:# 属性:不发生变化的属性
        
      • 定义一个常量类

        class Common:ODS_DB_NAME = "one_make_ods"……
        
        • file1.py:创建数据库

          create database if not exists Common.ODS_DB_NAME;
          
          • file2.py:创建表

            ```
            create table if not exists Common.ODS_DB_NAME.tbname
            ```
            
            • file3.py:插入数据到表中

              insert into table  Common.ODS_DB_NAME.tbname
              
            • 问题1:容易写错

            • 问题2:不好修改

02:课程目标

  • 目标:自动化的ODS层与DWD层构建
  • 实现
    • 掌握Hive以及Spark中建表的语法规则
    • 实现项目开发环境的构建
    • 自己要实现所有代码注释
    • ODS层与DWD层整体运行测试成功

03:数仓分层回顾

  • 目标:回顾一站制造项目分层设计

  • 实施

    image-20210821102418366

    • ODS层 :原始数据层

      • 来自于Oracle中数据的采集

      • 数据存储格式:AVRO

      • ODS区分全量和增量

      • 实现

        • 数据已经采集完成

          /data/dw/ods/one_make/full_imp
          /data/dw/ods/one_make/incr_imp
          
        • step1:创建ODS层数据库:one_make_ods

        • step2:根据表在HDFS上的数据目录来创建分区表

        • step3:申明分区

    • DWD层

      • 来自于ODS层数据
      • 数据存储格式:ORC
      • 不区分全量和增量的
      • 实现
        • step1:创建DWD层数据库:one_make_dwd
        • step2:创建DWD层的每一张表
        • step3:从ODS层抽取每一张表的数据写入DWD层对应的表中
  • 小结

    • 回顾一站制造项目分层设计

04:Hive建表语法

  • 目标:掌握Hive建表语法

  • 实施

    CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
    (col1Name col1Type [COMMENT col_comment],co21Name col2Type [COMMENT col_comment],co31Name col3Type [COMMENT col_comment],co41Name col4Type [COMMENT col_comment],co51Name col5Type [COMMENT col_comment],……coN1Name colNType [COMMENT col_comment])
    [PARTITIONED BY (col_name data_type ...)]
    [CLUSTERED BY (col_name...) [SORTED BY (col_name ...)] INTO N BUCKETS]
    [ROW FORMAT row_format]row format delimited fields terminated by lines terminated by
    [STORED AS file_format]
    [LOCATION hdfs_path]
    TBLPROPERTIES
    
    • EXTERNAL:外部表类型(删除表的时候,不会删除hdfs中数据)
      • 内部表、外部表、临时表
    • PARTITIONED BY:分区表结构
      • 普通表、分区表、分桶表
    • CLUSTERED BY:分桶表结构
    • ROW FORMAT:指定分隔符
      • 列的分隔符:\001
      • 行的分隔符:\n
    • STORED AS:指定文件存储类型
      • ODS:avro
      • DWD:orc
    • LOCATION:指定表对应的HDFS上的地址
      • 默认:/user/hive/warehouse/dbdir/tbdir
    • TBLPROPERTIES:指定一些表的额外的一些特殊配置属性
  • 小结

    • 掌握Hive建表语法

05:Avro建表语法

  • 目标:掌握Hive中Avro建表方式及语法

  • 路径

    • step1:指定文件类型
    • step2:指定Schema
    • step3:建表方式
  • 实施

    • Hive官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable

    • DataBrics官网:https://docs.databricks.com/spark/2.x/spark-sql/language-manual/create-table.html

    • Avro用法:https://cwiki.apache.org/confluence/display/Hive/AvroSerDe

    • 指定文件类型

      • 方式一:指定类型

        stored as avro
        
      • 方式二:指定解析类

        --解析表的文件的时候,用哪个类来解析
        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'
        
    • 指定Schema

      • 方式一:手动定义Schema

        CREATE TABLE embedded
        COMMENT "这是表的注释"
        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'
        TBLPROPERTIES ('avro.schema.literal'='{"namespace": "com.howdy","name": "some_schema","type": "record","fields": [ { "name":"string1","type":"string"}]}'
        );      	
        
      • 方式二:加载Schema文件

        CREATE TABLE embedded
        COMMENT "这是表的注释"
        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'
        TBLPROPERTIES ('avro.schema.url'='file:///path/to/the/schema/embedded.avsc'
        );
        
    • 建表语法

      • 方式一:指定类型和加载Schema文件

        create external table one_make_ods_test.ciss_base_areas
        comment '行政地理区域表'
        PARTITIONED BY (dt string)
        stored as avro
        location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'
        TBLPROPERTIES ('avro.schema.url'='/data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avsc');
        
      • 方式二:指定解析类和加载Schema文件

        create external table one_make_ods_test.ciss_base_areas
        comment '行政地理区域表'
        PARTITIONED BY (dt string)
        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 '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'
        TBLPROPERTIES ('avro.schema.url'='/data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avsc');
        
        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上的路径')
        

  • 小结

    • 掌握Hive中Avro建表方式及语法

相关文章:

助力工业物联网,工业大数据之ODS层及DWD层建表语法【七】

文章目录 ODS层及DWD层构建01:课程回顾02:课程目标03:数仓分层回顾04:Hive建表语法05:Avro建表语法 ODS层及DWD层构建 01:课程回顾 一站制造项目的数仓设计为几层以及每一层的功能是什么? ODS&…...

Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)

参考文章https://blog.csdn.net/xray2/article/details/120497146 之所以多次一举自己写多一篇文章,主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。 1.首先确认一下自己的代码是Win32的还是Win64的,我操作系统是64的,忘…...

TensorFlow高阶API和低阶API

TensorFlow提供了众多的API,简单地可以分类为高阶API和低阶API. API太多太乱也是TensorFlow被诟病的重点之一,可能因为Google的工程师太多了,社区太活跃了~当然后来Google也意识到这个问题,在TensorFlow 2.0中有了很大的改善。本文…...

强训之【参数解析和跳石板】

目录 1.参数解析1.1题目描述1.2思路1.3代码 2.跳石板2.1题目2.2思路2.3代码 3.选择题 1.参数解析 1.1题目描述 在命令行输入如下命令: xcopy /s c:\ d:\e, 各个参数如下: 参数1:命令字xcopy 参数2:字符串/s 参数…...

Redis队列Stream、Redis多线程详解(三)

Redis中的线程和IO模型 什么是Reactor模式 ? “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注册一个事件处理器,表示自己对某些事件感兴趣&#xff0…...

MySQL统计函数count详解

count()概述 count() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为null数据,或者去重数据 count(1)和count()和count(列名)的区别 1.函数说明 count(1):统计所有的记录&#xff0…...

实验04:图像压缩(DP算法)

1.实验目的: 掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具,运用动态规划的思想来求解图像压缩问题。 2.实验内容: 给定一幅图像,求解最佳压缩,使得压缩后的文件最小。 3.实验要求…...

4.19--面试系列之真题版本--redis出现大key怎么解决?Redis 大 Key 对持久化有什么影响?

对于redis出现大key的情况,可以通过以下几种方式来解决: 1.分布式存储:将大key拆分成多个小的key,分别存储在不同的节点上。 2.数据过期:对于大key中不经常使用的数据,可以使用redis自带的过期特性&#xf…...

新手在家做自媒体要如何起步?

不少人都想做自媒体来增加自己的收入或者创业,但没有人带领,自己像是无头苍蝇一样,不知道往哪里走。 今天这期内容大周就来给粉丝们分享一点干货,如果对你有所帮助,记得点赞支持一下大周。 1、注册账号 如果你连一个…...

易基因:禾本科植物群落的病毒组丰度/组成与人为管理/植物多样性变化的相关性 | 宏病毒组

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 现代农业通过简化生态系统、引入新宿主物种和减少作物遗传多样性来影响植物病毒的出现。因此,更好理解农业生态中种植和未种植群落中的病毒分布,以及它们之间的病…...

华为OD机试——对称美学(通过率只有8.51%???)

用java写的这道题,两个样例都可以通过,但是提交之后最终的通过率只有8.51%???自己搞了半天一直都是这个通过率,然后用网上说的100%通过率的代码也是一样的结果,最后时间到了还是没有拿到满分&am…...

【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解

引言 Vue 3 的虚拟 DOM 是一种用于优化 Vue 应用程序性能的技术。它通过将组件实例转换为虚拟 DOM,并在组件更新时递归地更新虚拟 DOM,以达到高效的渲染性能。在 Vue 3 中,虚拟 DOM 树由 VNode 组成,VNode 是虚拟 DOM 的基本单元…...

Arduino ESP8266通过udp获取时间以及同步本地时间方法

Arduino ESP8266通过udp获取时间以及同步本地时间 ✨通过udp获取NTP服务器上的时间戳,然后经过转换,得到当前具体的时间。转换相对复杂,对于获取时间还是相对比较准确。📝通过udp获取时间实现代码 #include <ESP8266WiFi.h> #include <WiFiUdp.h>//填写 WiFi…...

c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

c/c&#xff1a;char*定义常量字符串&#xff0c;strcmp()函数&#xff0c;strcpy()函数&#xff0c;寻找指定字符&#xff0c;字符串去空格 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所…...

2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布

2023年4月23日&#xff0c;据DAMA中国官方信息&#xff0c;目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算6月考试的朋友们可以抓紧时间报名啦…...

UDS的0x19服务介绍

什么是 UDS&#xff1f; UEI (Unified Diagnostic Services&#xff0c;统一诊断服务) 是一种在车辆电子控制单元 (ECU) 之间交换诊断信息的标准通信协议&#xff0c;它是OBD-II的某些扩展。利用 UDS 协议&#xff0c;诊断工程师可以访问车辆的各种功能&#xff0c;如读取故障…...

QinQ技术与Portal技术

QinQ 802.1Q-in-802.1Q&#xff0c;是一种扩展VLAN标签技术。在城域网中&#xff0c;需要大量的VLAN来隔离区分不同的用户&#xff0c;但是原有的802.1Q只有12个比特&#xff0c;仅能标识4096个VLANQinQ即在802.1Q的基础上&#xff0c;再增加一层外层标签。使得可以标识4096*40…...

Vue-自定义表单验证(rule,value,callback)详细使用

前言 最近在实际开发中遇到需要验证合同编号是否在数据库已经存在&#xff0c;自定义表单验证。 的表单验证大家都知道form绑定rules&#xff0c;prop绑定值与form.值一样&#xff0c;必填&#xff0c;失去焦点触发 提示信息。 今天我们讲一讲自定义验证规则具体使用场景和它…...

港联证券|TMT板块全线退潮,这些个股获主力逆市抢筹

计算机、电子、传媒、通讯职业流出规模居前。 今天沪深两市主力资金净流出709.92亿元&#xff0c;其中创业板净流出218.36亿元&#xff0c;沪深300成份股净流出187.92亿元。 资金流向上&#xff0c;今天申万一级职业普跌&#xff0c;除了国防军工职业小幅上涨&#xff0c;获主…...

WPF学习

一、了解WPF的框架结构 &#xff08;第一小节随便看下就可以&#xff0c;简单练习就行&#xff09; 1、新建WPF项目 xmlns&#xff1a;XML的命名空间 Margin外边距&#xff1a;左上右下 HorizontalAlignment&#xff1a;水平位置 VerticalAlignment&#xff1a;垂直位置 2…...

C#使用WebDriver模拟浏览器操作WEB页面

有时候需要模拟访问页面触发某个功能&#xff0c;可以使用WebDriver来实现这一功能&#xff0c;驱动打开浏览器&#xff0c;并对页面重定向以及对页面写入脚本等操作。 安装Selenium.Chrome&#xff0c;Selenium.Support.UI&#xff0c;Selenium 引入 using OpenQA.Selenium.…...

正则表达式 - 简单模式匹配

目录 一、测试数据 二、简单模式匹配 1. 匹配字面值 2. 匹配数字和非数字字符 3. 匹配单词与非单词字符 4. 匹配空白字符 5. 匹配任意字符 6. 匹配单词边界 7. 匹配零个或多个字符 8. 单行模式与多行模式 一、测试数据 这里所用文本是《学习正则表达式》这本书带的&a…...

银行数字化转型导师坚鹏:银行数字化转型培训方案

目录 一、银行数字化转型培训背景 二、银行数字化转型模型 三、银行数字化转型课程设计思路 四、 银行数字化转型课程基本介绍 五、 银行数字化转型课程设置 六、银行数字化转型课程大纲 七、培训方案实施流程 一、银行数字化转型培训背景 2020年1月3日&#xff…...

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-…...

Shell知识点(一)

1.echo 命令 echo命令的作用是在屏幕输入一行文本&#xff0c;可以降该命令的参数原样输出。 $ echo hello world hello world 如果想要输出的是多行文本&#xff0c;包含换行符&#xff0c;这时就需要把多行文本放在引号里面 $ echo "<HTML><HEAD><TITLE…...

mysql 索引失效、联合索引失效场景和举例

索引失效 假设有一张user 表&#xff0c;表中包含索引 (id); (name); (birthday); (name,age); 对索引字段进行函数操作 select name from user where year(birthday) 2000;使用模糊查询&#xff0c;查询中使用通配符 select name from user where name like %益达%;使用i…...

快速将PDF转换为图片:使用在线转换器的步骤

PDF文件是一种常见的文档格式&#xff0c;但在某些情况下需要将其转换为图片格式&#xff0c;例如将PDF文件插入PPT演示文稿中。此时&#xff0c;使用在线PDF转换器是一种快速且简便的方法。 本文将介绍如何使用在线转换器将PDF文件转换为图片格式。 步骤1&#xff1a;选择合…...

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开&#xff0c;因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验&#xff0c;以及GPT-4的预期功能推测一些可能的使用步骤&#xff1a; 选择适合的GPT-4实现技术&#xff1a;GPT-4可能有不同的实现技术&#xff…...

Docker 相关概念

1、Docker是什么&#xff1f; 如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; 答案就是使用容器。Docker之所以发展如此迅速&#xff0c;也是因为它对…...

STM32平衡小车 TB6612电机驱动学习

TB6612FNG简介 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 VM电…...