一文读懂数据仓库

本文介绍了数据仓库的概念、特点和构建过程,包括数据集市、ETL(抽取、转换、加载)流程,以及数据建模方法。以客户流失分析为例,阐述了如何从多个数据源收集信息,进行数据清洗、建模,最终得出客户流失模型,为业务决策提供依据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据仓库

数据仓库(Data Warehouse DW)是为了便于多维分析和多角度展现而将数据按特定的模式进行存储所建立起来的大型数据库,它的数据基于事务型的关系数据库。

数据仓库中的数据是相对稳定的、集成的、面向主题的、反映历史变化的,以分析需求为目的数据集合。

数据集市

数据集市是数据仓库的一个逻辑子集。

(1) 特定用户群体所需的信息,通常是一个部门或者一个特定组织的用户。

(2) 访问相对稳定的业务信息。(以预定的时间间隔进行更新,不受数据库系统中的更新的影响。)

(3) 来自于组织里多个运行系统的信息,比如账目、销售、库存和客户管理以及组织外部的行业数据。

(4) 数据集市是部门级的,相对于庞大的数据仓库来讲,其查询和分析的响应时间会大大缩短。

ETL

ETL将分散在各个系统中的数据抽取出来,并将这些不同源的数据进行转换和整合,得出一致性的数据,然后加载到数据仓库中。

ETL搭建了各业务系统和数据仓库之间的桥梁,也就是基于业务系统的数据生成数据仓库。

在数据仓库的构建中,ETL贯穿于项目始终。

展示

(1)可视化工具

(2) 仪表盘

(3) 系统界面

数据仓库的建模

(1)梳理数据来源,确定数据所在的外部系统。

(2)业务建模:针对业务进行全方面的梳理和分解。

(3)概念模型:把业务建模的各个业务流程过程抽象出实体以及实体和实体之间的关系。

(4)逻辑模型:是数据仓库项目的核心基础。好的逻辑模型能够保证数据仓库的稳定性,同时很容易理解数据,处理数据的效率也很高。

(5)维度建模:对某一主题,通过建设维度和事实来快速建设数据仓库。

 a)确定主题。比如航班的上座率、收益。

 b)确定量度。要分析的技术指标,比如年收益率、年上座率。

 c)确定数据粒度。采用“最小粒度原则”。

 d)确定维度。指分析的各个角度。比如按照时间、按照起始地。

 e)创建事实表。量度的实际数据。

案例分析

客户流失分析

组成如下图所示。

    

(1)客户流失的分析和定义

从本运营商转到其他运营商、从高费用套餐转到低费用套餐、欠费等原因被动停机。

(2)数据选择

数据来自不同的系统,比如CRM、BOSS、经分、电子渠道等等。数据会很多,客户个人信息(星级、年龄、婚姻状况、地址、收入、教育程度、行业、性别、居住地、是否在职等等)、使用服务信息(套餐类型、上月基本话费,上月长话费,上月上网费,累计基本话费,累计长话费,累计上网费等等)、甚至外部的征信数据(消费、信用度)。

(3)数据清洗和预处理

对空值、无效值、异常值处理。

(4)建模

根据通话时长、上网时长、收入、年龄等多个主题建立维表,进行挖掘分析,建立客户流失模型。

(5)计算结果

收入低、年轻人、通话少、上网少的人群容易离网。

(6)模型评估

对计算的结果进行检验,验证模型的有效性。

(7)优化和调整

进一步的优化和调整,得到更精确的结果。这是一个不断改进的过程。

 

### UART基本概念 UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发传输器,是一种用于串行通信的硬件电路。其主要功能是在微处理器和外设之间进行数据交换。UART允许两个设备通过一根信号线发送数据,另一根信号线接收数据[^1]。 在嵌入式系统中,UART常被用来实现主机与外部设备之间的简单而有效的双向通信。这种接口广泛应用于各种场景,比如调试信息输出、传感器读取以及与其他单片机或计算机系统的连接等。 ### 工作原理 UART的工作基于字符帧的概念,每一帧由起始位、若干个数据位、可选奇偶校验位及停止位组成。当准备传送一个字节的数据时: - 发送端会先发出低电平作为起始标志; - 接着依次按低位到高位顺序送出该字节中的各个比特; - 如果启用了错误检测机制,则会在最后附加一位用于检验目的的奇偶校验码; - 最终以高电平表示一帧结束——这被称为停止位。 在整个过程中,波特率决定了每秒钟能够传输多少位的信息量;双方必须事先协商好一致的速度设置才能正常通讯[^2]。 ### 应用实例解析 为了更好地理解上述理论知识的实际运用情况,下面给出一段简单的C++代码片段展示了一个典型的UART应用程序设计思路。此程序实现了从串口接收到的数据加上数值`1`之后再回传给对方的功能。 #### 文件结构说明 整个项目分为三个部分:主函数入口(`main.cpp`)负责初始化并启动其他模块;具体的串口操作封装于类方法内部(`uart.cpp`);头文件定义了对外公开接口(`uart.h`)供调用者使用。 #### 主要源代码清单 ##### `uart.h` ```cpp #ifndef UART_H_ #define UART_H_ #include <string> class Uart { public: bool init(const std::string& device, int baudrate); ssize_t read(char* buffer, size_t length); ssize_t write(const char* data, size_t length); private: int fd_; // File descriptor for the serial port. }; #endif /* UART_H_ */ ``` ##### `uart.cpp` ```cpp #include "uart.h" #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <cstring> bool Uart::init(const std::string& device, int baudrate) { struct termios options; fd_ = open(device.c_str(), O_RDWR | O_NOCTTY | O_SYNC); if (fd_ < 0) return false; tcgetattr(fd_, &options); cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); cfmakeraw(&options); tcsetattr(fd_, TCSANOW, &options); return true; } ssize_t Uart::read(char *buffer, size_t length){ return ::read(fd_, buffer, length); } ssize_t Uart::write(const char *data, size_t length){ return ::write(fd_, data, length); } ``` ##### `main.cpp` ```cpp #include "uart.h" int main() { Uart uart; const char* dev_name="/dev/ttyS0"; unsigned char buf[1]; if (!uart.init(dev_name, 9600)) { perror("Failed to initialize UART"); return EXIT_FAILURE; } while(true){ if(uart.read(reinterpret_cast<char*>(buf), sizeof(buf))>0){ (*buf)++; uart.write(reinterpret_cast<const char*>(buf),sizeof(buf)); } } close(uart.fd_); return EXIT_SUCCESS; } ``` 以上就是关于UART协议及其具体应用场景的一个较为完整的介绍。希望这些资料能帮助加深对这一重要技术的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值