ETL 数据抽取

news2025/1/15 22:15:23

ETL

ETL 数据抽取

ETL(Extract, Transform, Load)是数据集成和处理的重要过程,其中数据抽取(Extract)是第一步,负责从各种数据源中提取数据。以下是ETL数据抽取的详细说明和常用工具:

1. 数据抽取的方法
1.1 从数据库中提取数据
  • 使用 SQL 查询:对于像 MySQL、Oracle 和 SQL Server 这类数据库,ETL 工具通常会利用 SQL(结构化查询语言)来提取数据。例如,通过编写简单的 SELECT 语句,可以从一个或多个表中获取所需的数据。
  • 数据库连接驱动:ETL 工具通过特定的数据库连接驱动来与数据库进行通信。这些驱动是软件组件,能够理解数据库的协议并将 ETL 工具的请求转换为数据库能够理解的操作。例如,Java - based 的 ETL 工具可能会使用 JDBC(Java Database Connectivity)驱动来连接数据库。当配置 ETL 工具时,需要指定数据库的连接信息,如主机名、端口号、数据库名称、用户名和密码等。驱动会根据这些信息建立与数据库的连接,然后执行提取数据的操作。
1.2 从 API 中提取数据
  • HTTP 请求:当把 API 作为数据源时,ETL 工具会通过发送 HTTP(超文本传输协议)请求来获取数据。对于 RESTful API,ETL 工具发送 GET 请求来检索数据。例如,要从一个提供天气数据的 API 获取某个城市的天气信息,ETL 工具可能会发送如下的 GET 请求,这个请求的 URL 指向了 API 的端点,其中包含了查询参数(如城市名称和数据类型)。ETL 工具会根据 API 的文档构建正确的请求 URL,然后发送请求。API 会返回数据,通常是 JSON 或 XML 格式,ETL 工具再对返回的数据进行解析。
  • 认证和授权:在与 API 交互时,可能需要进行认证和授权。常见的认证方式包括 API 密钥、OAuth 等。ETL 工具需要在请求中包含这些认证信息,以确保能够成功获取数据。
1.3 从文件系统中提取数据
  • 文件读取:ETL 工具可以读取各种格式的文件,如 CSV、TXT、XML 等。这些文件可以存储在本地文件系统或网络共享位置。ETL 工具通过文件路径和读取操作来提取数据。
  • 文件监听:对于需要实时处理的文件,ETL 工具可以设置文件监听器,当文件发生变化时,自动触发数据抽取操作。
2. 数据抽取的模式
2.1 全量抽取
  • 全量加载(Full Load):将所有经过处理的数据一次性加载到目标存储中,适用于初始加载或数据量较小的情况。
2.2 增量抽取
  • 增量加载(Incremental Load):只加载抽取和转换后发生变化的数据,以保证数据的实时性和效率。
  • 数据变更检测:增量抽取需要检测数据的变化,常用的方法包括:
    • 时间戳:记录每次数据抽取的时间戳,只抽取时间戳之后发生变化的数据。
    • 变更日志:利用数据库的变更日志(如 MySQL 的 binlog、PostgreSQL 的 WAL)来检测数据变化。
    • 触发器:在数据库表上设置触发器,记录数据变化的信息,ETL 工具根据这些信息进行增量抽取。
3. 常用的 ETL 工具
3.1 Kettle
  • 简介:Kettle 是一款免费的开源 ETL 工具,使用广泛,功能强大。它通过图形化界面(Spoon)设计 ETL 转换过程,支持批量运行(Pan)和任务调度(Kitchen)。
  • 优点
    • 纯 Java 编写,跨平台运行。
    • 数据抽取高效稳定。
    • 支持丰富的数据源和转换功能。
  • 使用场景:适用于各种数据抽取、转换和加载任务,特别是需要复杂数据处理和转换的场景。
3.2 DataX
  • 简介:DataX 是一款开源的数据同步工具,由阿里巴巴开源。它支持多种数据源,包括关系型数据库、NoSQL 数据库、文件系统等。
  • 优点
    • 高效的数据同步能力。
    • 支持多种数据源和数据格式。
    • 简单易用,配置灵活。
  • 使用场景:适用于大规模数据同步和数据迁移任务,特别是需要高效数据传输的场景。
3.3 Apache Nifi
  • 简介:Apache Nifi 是一款开源的实时数据流处理工具,适合处理实时数据流。
  • 优点
    • 实时数据处理能力强大。
    • 支持多种数据源和数据格式。
    • 提供丰富的数据处理组件。
  • 使用场景:适用于需要实时数据处理和流式数据处理的场景,如物联网数据处理、实时监控等。
3.4 Talend Open Studio
  • 简介:Talend Open Studio 是一款功能强大的开源 ETL 工具,支持各种数据源,适合批量和实时 ETL。
  • 优点
    • 功能丰富,支持多种数据源和数据格式。
    • 提供图形化界面,易于使用。
    • 支持复杂的数据转换和处理。
  • 使用场景:适用于企业级数据集成和处理任务,特别是需要处理多种数据源和复杂数据转换的场景。

总结

ETL 数据抽取是数据集成和处理过程中的关键步骤,负责从各种数据源中提取数据。通过选择合适的 ETL 工具和数据抽取方法,可以确保数据抽取的高效性、准确性和可靠性。在实际应用中,需要根据企业的业务需求和数据特点选择合适的 ETL 工具,并合理配置和优化其抽取功能。

从 Oracle 数据库中抽取数据

从 Oracle 数据库中抽取数据有多种方法,以下是常见的几种方法及其具体操作步骤:

1. 使用 SQL 语句

这是最直接的方法,适用于简单的数据抽取需求。通过编写 SQL 查询语句,可以直接从 Oracle 数据库中查询并导出数据。例如,使用 SELECT 语句按照条件查询表中的数据。

2. 使用 Oracle 导出工具

对于数据量较大的情况,可以使用 Oracle 提供的导出工具,如 EXP 和 EXPDP,将数据导出到文件中进行传输或备份。

3. 使用 Oracle 数据集成工具

Oracle 提供了多种数据集成工具,如 Oracle GoldenGate 和 Oracle Data Integrator(ODI),可以实现更复杂的数据操作,包括实时数据抽取、数据转换和数据加载等。

3.1 Oracle GoldenGate

Oracle GoldenGate 是一种实时数据复制和数据集成技术,可以将数据实时从 Oracle 数据库中抽取到目的地,包括数据仓库、Hadoop、NoSQL 等大数据平台。它能够实时捕获数据库变更,并将这些变更应用到目标解决方案中。具体步骤如下:

  • 创建 GoldenGate 抽取进程:
    ADD EXTRACT et_myora, SOURCEISTABLE;
    
  • 定义抽取规则:
    ADD EXTRACT EXT1, INTEGRATED TRANLOG, BEGIN2019-10-16 00:00:00;
    
  • 开始抽取:
    START EXTRACT EXT1;
    
3.2 Oracle Data Integrator(ODI)

ODI 是一种强大的 ETL 工具,可以将数据从多个数据源(包括 Oracle 数据库)中抽取到数据仓库中,并进行数据变换和数据加载。具体步骤如下:

  • 创建 ODI 项目:
    CREATE PROJECT myODI;
    
  • 创建 ODI 模型:
    CREATE MODEL myModel (CONNECT: Oracle Source);
    
  • 创建源表和目标表:
    CREATE TABLE Source ();
    CREATE TABLE Destination ();
    
  • 创建 ODI 接口:
    CREATE INTERFACE myInterface (CONNECT: Oracle Source, Oracle Target);
    
  • 定义 ODI 接口变换规则:
    DEFINE TRANSFORMATION myTransform ();
    
  • 开始 ODI 接口:
    START INTERFACE myInterface;
    

4. 增量式抽取

当数据量较大时,一次性抽取全部数据较为耗时。通过增量式抽取,可以只抽取目标范围内发生过改变的数据,以最小化抽取的数据量,提高数据操作效率。SQL 语句实现增量式抽取的形式如下:

SELECT * FROM TABLE_NAME WHERE last_update_time > TO_DATE('2024-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');

5. 使用触发器和同步进程

可以通过创建 DML 和 DDL 触发器,将操作转换成对应的 SQL 语句,并通过 DBMS_CAPTURE_ADM 和 DBMS_APPLY_ADM 包进行数据同步。具体步骤如下:

  • 创建用户和表空间:
    CREATE USER EXTRACT IDENTIFIED BY PASSWD;
    CREATE TABLESPACE TBS_EXTRACT;
    GRANT CONNECT, RESOURCE, DBA TO EXTRACT;
    GRANT UNLIMITED TABLESPACE TO EXTRACT;
    
  • 创建 DML 和 DDL 触发器:
    CREATE OR REPLACE TRIGGER DML_EXTRACT
    AFTER INSERT OR UPDATE OR DELETE ON T1
    DECLARE
      V_STATEMENT VARCHAR2(4000);
    BEGIN
      IF INSERTING THEN
        V_STATEMENT := 'INSERT INTO T1 VALUES (:OLD.C1, :OLD.C2, :OLD.C3)';
      ELSIF UPDATING THEN
        V_STATEMENT := 'UPDATE T1 SET C2 = :NEW.C2 WHERE C1 = :OLD.C1';
      ELSIF DELETING THEN
        V_STATEMENT := 'DELETE FROM T1 WHERE C1 = :OLD.C1';
      END IF;
      DBMS_CAPTURE_ADM.PROPAGATE(V_STATEMENT);
    END;
    /
    CREATE OR REPLACE TRIGGER DDL_EXTRACT
    AFTER CREATE OR ALTER OR DROP ON DATABASE
    DECLARE
      V_STATEMENT VARCHAR2(4000);
    BEGIN
      IF DICTIONARY_OBJ_TYPE = 'TABLE' THEN
        V_STATEMENT := 'CREATE TABLE T1 (C1 NUMBER, C2 VARCHAR2(10), C3 DATE)';
        DBMS_CAPTURE_ADM.PROPAGATE(V_STATEMENT);
      ELSIF DICTIONARY_OBJ_TYPE = 'INDEX' THEN
        V_STATEMENT := 'CREATE INDEX IDX_T1 ON T1 (C1)';
        DBMS_CAPTURE_ADM.PROPAGATE(V_STATEMENT);
      END IF;
    END;
    /
    
  • 创建同步进程:
    BEGIN
      DBMS_CAPTURE_ADM.CREATE_CAPTURE(
        CAPTURE_NAME => 'CAPTURE_EXTRACT',
        QUEUE_NAME => 'QUEUE_EXTRACT',
        RULE_SET_NAME => 'RULE_SET_EXTRACT',
        STATUS => 'ENABLED'
      );
      DBMS_APPLY_ADM.CREATE_APPLY(
        APPLY_NAME => 'APPLY_EXTRACT',
        QUEUE_NAME => 'QUEUE_EXTRACT',
        STATUS => 'ENABLED',
        APPLY_USER => 'APPLY',
        TABLE_CONFLICT_ACTION => 'REPLACE'
      );
    END;
    /
    BEGIN
      DBMS_CAPTURE_ADM.ADD_TABLE_RULE(
        CAPTURE_NAME => 'CAPTURE_EXTRACT',
        SCHEMA_NAME => 'TEST',
        TABLE_NAME => 'T1',
        OPERATION_MASK => DBMS_CAPTURE_PASSTHRU_INSERT + DBMS_CAPTURE_PASSTHRU_UPDATE + DBMS_CAPTURE_PASSTHRU_DELETE
      );
    END;
    /
    
  • 测试数据同步:
    INSERT INTO T1 VALUES (1, 'A', SYSDATE);
    UPDATE T1 SET C2 = 'B' WHERE C1 = 1;
    DELETE FROM T1 WHERE C1 = 1;
    

6. 使用 LogMiner 实现增量数据抽取

LogMiner 是 Oracle 提供的一种工具,可以用于捕获数据库的变更日志,从而实现增量数据抽取。具体步骤如下:

  • 配置 LogMiner:
    • 在源数据库中启用 LogMiner 功能。
    • 设置 LogMiner 参数,如日志文件的存储路径和保留时间。
  • 设计 ODI 抽取流程:
    • 在 ODI Studio 中创建新的数据集成项目。
    • 定义数据源和目标系统,配置数据库连接信息。
    • 选择 “Oracle 9i/10g/11g Consistent (LOGMINER)” 知识模块。
  • 实现增量抽取:
    • 设置增量抽取的起始时间点,ODI 将从此时间点开始读取数据库的变更记录。
    • 配置数据映射和转换规则,确保源数据正确映射到目标数据结构。
    • 执行数据集成任务,ODI 将自动读取 LogMiner 生成的变更记录,并抽取相应的增量数据。
  • 验证数据一致性:
    • 确保抽取的数据与源数据库中的数据一致。

7. 提取 XML 子节点值

如果需要从 Oracle 数据库中的 XML 数据中提取子节点值,可以使用 XMLTypeextractValue 函数,或使用 XMLTable 函数。例如:

  • 使用 XMLTypeextractValue 函数:
    SELECT extractValue(xml_column, '//nodeName') AS nodeValue
    FROM xml_table;
    
  • 使用 XMLTable 函数:
    SELECT *
    FROM xml_table,
    XMLTable('//nodeName' PASSING xml_column COLUMNS nodeValue VARCHAR2(100) PATH '.') x;
    

总结

从 Oracle 数据库中抽取数据的方法多种多样,具体选择哪种方法取决于数据抽取的需求、数据量大小以及是否需要实时性等。对于简单的数据抽取任务,可以使用 SQL 语句或导出工具;对于复杂的数据抽取任务,可以使用 Oracle GoldenGate 或 ODI 等数据集成工具。同时,增量式抽取和 LogMiner 技术可以有效提高数据抽取的效率和实时性。

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

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

相关文章

【2025 Rust学习 --- 17 文本和格式化 】

字符串与文本 Rust 的主要文本类型 String、str 和 char 内容概括: Unicode 背景知识?单个 Unicode 码点的 char?String 类型和 str 类型都是表示拥有和借用的 Unicode 字符序列。Rust 的字符串格式化工具,比如 println! 宏和 …

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的:创建适用于该项目的环境,与系统环境隔离,防止污染系统环境(包括需要的库)虚拟环境配置存放在项目根目录下的 ven…

phpenc加密程序源码

免费扩展加密程序,类似于sg11加密,支持单个PHP(免费)文件以及批量PHP文件(ZIP压缩包格式)源码加密的保护平台,加密后的源码文件保持原有代码结构,可以跨平台运行,可以运行…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程,这一过程在现代数字媒体中扮演着至关重要的角色。众所周知,视频转码不仅仅是简单的格式转换,它涉及多个关键参数的改变,例如视频编码格式、比特率、分辨率以及帧率…

LeetCode热题100(哈希篇)

题目出自Leetcode热题100:Leetcode热题100 文章目录 1. 两数之和思路代码CJavaPython 49. 字母异位词分组思路代码CJavaPython 128. 最长连续序列思路代码CJavaPython 总结 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找…

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中,我们至少掌握了两种方法,可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现,相关学习链接为: python学opencv|读取图像(三)放大和缩小图像_python opencv 读取图…

rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库

问题说明: 客户反馈 ,buildroot 系统 ,使用qt 使用sqlite ,有报错,无法使用sqlite. 测试情况说明: 我自己测试,发现, buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…

Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt绘图基础 QPainter概述 基本工作流程 绘图事件系统 paintEvent事件 重绘机制 文字绘制技术 基本文字绘制 ​编辑 高级文字效果 基本图形绘制 线条绘制 ​编辑 形状绘制 …

OpenArk64:Windows 系统分析与逆向工程工具详解

引言 在 Windows 系统的底层操作和逆向工程领域,OpenArk 是一款备受推崇的开源工具集。而 OpenArk64.exe 是 OpenArk 工具的 64 位版本,专门用于 64 位 Windows 系统。它提供了强大的功能,帮助用户深入分析系统内核、进程、文件、注册表等&a…

浅谈计算机网络02 | SDN控制平面

计算机网络控制平面 一、现代计算机网络控制平面概述1.1 与数据平面、管理平面的关系1.2 控制平面的发展历程 二、控制平面的关键技术剖析2.1 网络层协议2.1.1 OSPF协议2.1.2 BGP协议 2.2 SDN控制平面技术2.2.1 SDN架构与原理2.2.2 OpenFlow协议2.2.3 SDN控制器 一、现代计算机…

【C++】PP5015 [NOIP2018 普及组] 标题统计

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示数据规模与约定 💯方法分析方法1:我的做法实…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》,让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识,顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话,可以看看博主的C语言专栏哟&#xff…

线程池面试题目集合

最近面试中总是问到ThreadPoolExecutor类相关问题,在此集中整理下。 问题1.ThreadPoolExecutor的关键参数是哪些,任务添加过程中,内部线程是怎样构建的? a)任务到达时,线程池数目小于核心线程数corePoolSize&#xff0…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统,可以通过以下几种方法尝试分析: 查看页面源代码: 打开网站,右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志,例如: WordPress 的迹象&#xff1a…

基于Media+Unity的手部位姿三维位姿估计

使用mediapipe Unity 手部位姿三维位姿估计 参考文章 基于Mediapipe的姿势识别并同步到Unity人体模型中 MediapipeUnity3d实现虚拟手_unity mediapipe-CSDN博客 需求 我的需求就是快速、准确的跟踪手部位姿并实现一个三维显示。 主要思路 搭建mdeiapipe系统&#xff0c…

构建高性能网络服务:从 Socket 原理到 Netty 应用实践

1. 引言 在 Java 网络编程中,Socket 是实现网络通信的基础(可以查看我的上一篇博客)。它封装了 TCP/IP 协议栈,提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上,进一步封装的高性能、异步事件驱动的…

Python入门10:高阶函数

一、什么是高阶函数 1.1、高阶函数的概念和作用: 高阶函数是指 接受函数作为参数 或者 返回函数 作为结果的函数。它在函数式编程中是一个重要概念(函数式编程(Functional Programming , FP )是一 种编程范式&#xf…

python-leetcode-矩阵置零

73. 矩阵置零 - 力扣(LeetCode) class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""m, n len(matrix), len(matrix[0])row_zero …

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改DQLData Query Languag…