PHP ETL (提取/转换/加载) 实现,依赖非常少。


README

Latest Stable Version License CI Workflow Coverage Total Downloads

好吧,您已经了解到提取/转换/加载(ETL)模式,并正在寻找一个PHP库来完成这些工作。好的,让我们开始吧!

bentools/etl 是一个灵活的PHP库,用于实现提取、转换、加载(ETL)模式,旨在简化数据处理任务。

目录

概念

让我们先了解一些基本概念

  • 提取:您有一个数据源(数据库、CSV文件等)- 一个 提取器 能够读取这些数据并提供一个项迭代器
  • 转换:对每个项应用转换。一个 转换器 可以生成0、1或多个项以 加载 (例如,1个项可能生成多个SQL查询)
  • 加载:将转换后的项加载到目标位置。例如,提取的项 已经被 转换 为SQL查询,您的 加载器 将运行这些查询到您的数据库。

安装

composer require bentools/etl

警告

当前版本(4.0)是完全重设计的,并引入了重大的BC(向后兼容性)中断。除非您完全了解这些更改,否则请避免从 ^2.0^3.0 升级。

用法

现在让我们看看这是多么简单

use BenTools\ETL\EtlExecutor;

// Given
$singers = ['Bob Marley', 'Amy Winehouse'];

// Transform each singer's name to uppercase and process the array
$etl = (new EtlExecutor())
    ->transformWith(fn (string $name) => strtoupper($name));

// When
$report = $etl->process($singers);

// Then
var_dump($report->output); // ["BOB MARLEY", "AMY WINEHOUSE"]

好吧,这并不难,这里我们基本上不需要 提取 任何东西(我们已经在迭代 $singers),我们也没有 加载 到任何地方,除了PHP内存。

您可能会问,“为什么你不用 array_map('strtoupper', $singers)?”您完全正确。

但是,有时提取、转换和/或加载会变得稍微复杂一些。您可能需要从文件中提取,从网络爬取内容,执行一对多转换,可能需要跳过一些项,或者重用一些提取、转换或加载逻辑。

这里是一个您能做的另一个示例

use BenTools\ETL\EventDispatcher\Event\TransformEvent;
use BenTools\ETL\Loader\JSONLoader;

use function BenTools\ETL\extractFrom;

$executor = extractFrom(function () {
    yield ['firstName' => 'Barack', 'lastName' => 'Obama'];
    yield ['firstName' => 'Donald', 'lastName' => 'Trump'];
    yield ['firstName' => 'Joe', 'lastName' => 'Biden'];
})
    ->transformWith(fn (array $item) => implode(' ', array_values($item)))
    ->loadInto(new JSONLoader())
    ->onTransform(function (TransformEvent $event) {
        if ('Donald Trump' === $event->transformResult->value) {
            $event->state->skip();
        }
    });

$report = $executor->process();

dump($report->output); // string '["Barack Obama", "Joe Biden"]'

或者

$report = $executor->process(destination: 'file:///tmp/presidents.json');
var_dump($report->output); // string 'file:///tmp/presidents.json' - content has been written here

您已经明白了。现在您可以开始编写您自己的工作流程了!

继续阅读 入门指南

贡献

欢迎贡献!不要犹豫提出食谱。

此库100%覆盖了 Pest 测试。

请确保使用以下命令运行测试,并在提交PR之前保持代码覆盖率。

composer ci:check

许可证

MIT。