bentools / etl
PHP ETL (提取/转换/加载) 实现,依赖非常少。
4.0.1
2023-12-11 16:28 UTC
Requires
- php: >=8.2
- psr/event-dispatcher: ^1.0
- psr/log: ^3.0
- symfony/options-resolver: @stable
- thecodingmachine/safe: ^2.5
Requires (Dev)
- bentools/iterable-functions: ^2.1
- doctrine/orm: ^2.16
- friendsofphp/php-cs-fixer: ^3.35
- mockery/mockery: ^1.6
- monolog/monolog: ^3.5
- pestphp/pest: ^2.24
- phpstan/phpstan: ^1.10
- phpstan/phpstan-mockery: ^1.1
- react/stream: ^1.3
- symfony/var-dumper: *
- dev-master
- 4.0.1
- 4.0
- 4.0-alpha16
- 4.0-alpha15
- 4.0-alpha14
- 4.0-alpha13
- 4.0-alpha12
- 4.0-alpha11
- 4.0-alpha10
- 4.0-alpha9
- 4.0-alpha8
- 4.0-alpha7
- 4.0-alpha6
- 4.0-alpha5
- 4.0-alpha4
- 4.0-alpha3
- 4.0-alpha2
- 4.0-alpha1
- 3.0-alpha.3
- 3.0-alpha.2
- 3.0-alpha
- 2.5.x-dev
- v2.5.1
- v2.5
- v2.4
- v2.3.2
- v2.3.1
- v2.3
- v2.2
- v2.1
- v2.0.2
- v2.0.1
- v2.0
- v1.1.0
- v1.0.2
- v1.0.1
- v1.0.0
This package is auto-updated.
Last update: 2024-08-28 18:51:49 UTC
README
好吧,您已经了解到提取/转换/加载(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。