jrmgx/etl-package

ETL:提取、转换、加载

v1.2.1 2023-03-03 12:41 UTC

This package is auto-updated.

Last update: 2024-09-09 20:55:59 UTC


README

此为正在进行中的工作

ETL:提取、转换、加载

此包将允许您

  • 提取来自指定源的数据
  • 转换数据以满足您的需求
  • 加载结果到指定的目的地

它基于以下描述的简单配置文件。

基本示例

在这个基本示例中

  • 我们从本地仓库获取CSV文件
  • 我们对数据进行了一些转换
  • 我们将转换后的数据以JSON格式发送到API

Yaml是可选的,它也可以是一个普通的PHP数组。

extract:
  pull:
    type: file
    uri: ./demo/data_in.csv
  read:
    format: csv
    options:
      trim: true

transform:
  filter:
    type: query
    options:
      where: 'Age > :min'
      parameters:
        min: 30
  mapping:
    type: expressive
    map:
      out.name: in.Name
      out.sex: in.Sex
      out.age_in_sec: 'in.Age * 365 * 24 * 60 * 60'

load:
  write:
    format: json
  push:
    type: http
    uri: https://webhook.site/f24c112b-8344-4fe3-a9e5-53baf36c912f
    options:
      headers:
        'Authorization': 'Basic 9e222b3b7647c7'

配置

在ETL部分,所有配置都集中在一个文件中,该文件描述了每个步骤。
但由于可读性的考虑,文档已经被拆分,每个组件都有自己的页面。

提取器

提取器负责从源中提取和读取数据。

提取:负责从其源(本地文件、API或数据库等)提取数据。
读取:给定提取阶段获取的资源,读取它并将其转换为后续处理的规范数组。

通常,提取和读取部分是独立的,但对于某些类型的资源(如数据库),它们需要协同工作(提取将建立并处理连接,读取将从该连接获取数据)。

转换器

转换器负责过滤和转换给定的数据。

过滤:给定数据,应用特定的过滤逻辑。
映射:给定数据,将输出字段与输入字段关联,可选地进行转换。

链式操作

有时您可能想利用多个转换器,您可以通过在 transformers 部分添加多个条目来实现。

transformers:
  first_transform: # This name does not matter, but it has to be unique
    mapping:
      type: simple
      map:
        out.name: in.Name
        out.sex: in.Sex
        out.size: in.Height

  second_transform: # This name does not matter, but it has to be unique
    filter:
      type: query
      options:
        where: 'size > :size'
        parameters:
          size: 2
    mapping:
      type: expressive
      map:
        out.name: in.name
        out.sex: in.sex
        out.squared: 'in.size * in.size'

加载器

加载器负责写入和推送数据。

写入:给定数据,将其写入并转换为指定的格式/类型。
推送:给定写入阶段获取的资源,将其推送到配置的源。

通常,写入和推送部分是独立的,但对于某些类型的资源(如数据库),它们需要协同工作(写入准备数据,推送处理连接)。

在您的项目中使用它

Symfony或通过依赖注入

在Symfony项目中,您可以将以下行添加到您的 services.yaml 中以使其工作

    Jrmgx\Etl\:
        resource: '../vendor/jrmgx/etl-package/src/'
        exclude:
            - '../vendor/jrmgx/etl-package/src/Config/'

这将所有内容注册为服务,然后您可以像这样注入 Etl

class YourService 
{
    public function __construct(private readonly Etl $etl) { }

    public function yourMethod(): void 
    {
        // Yaml is optional, you can provide an array instead
        $configFile = Yaml::parseFile(__DIR__.'/../../config/etl.yaml');
        $config = new Config($configFile, __DIR__ . '/../../');

        $this->etl->execute($config);
    }
}

在其他使用依赖注入的项目中,这应该非常相似。

手动设置

待办事项

添加自定义提取器/转换器/加载器

实现自定义提取器

...

实现自定义转换器

...

实现自定义加载器

...

开发环境

安装项目

...

运行项目

...

测试和代码风格

...

许可

MIT

归属

data_in.csv 数据来源: https://people.sc.fsu.edu/~jburkardt/data/csv/csv.html