我有一个输入表,其中有170.000条记录可以在我的步骤中进行转换。
每条记录都有一个持续时间,特别是几天,JS步骤检查此持续时间,例如,如果记录具有ini_date(2011/01/01) - end_date(2020/01/01)
,那么JS将为该记录创建aprox 3000行(输出会带来170.000条记录不同的范围...其中一些持续9年)
起初,我仅使用js步骤通过联接步骤,选择值步骤,对行进行排序和填充来完成此任务。然后,我将某些“数据转换”使用“计算器步骤”拆分给他们,以为这将缩短处理时间,但是我得到了相同的处理时间
我只希望将处理时间从5小时缩短到至少一到2,但是在转换中创建的行数太大而无法实现。请记住,如果一条记录的期限为9年,则将产生3000行左右的aprox,而这仅仅是一个记录。知道输入步骤带来了170.000条记录和不同范围。
答案 0 :(得分:2)
如果您的JS步骤产生了约1亿行,则ETL的运行速度约为每秒5.5k行。它不快,但也不慢。
我不太清楚您要实现的目标,很高兴看到小组成员的工作。
但是,不管怎样,这里有一些想法可以使其更快:
在JS中创建新行特别慢,应该避免。您最好使用计算器步骤在日期之间进行几天的计算,然后使用克隆行创建所需的行副本。您可以添加一个“克隆号”字段,该字段为每个重复的行提供一个计数器,以便随后的计算器步骤可以执行将计数器添加到开始日期的操作。
如果要对行进行分组,则必须按组键对输入进行排序,否则会得到意外的结果。
运行转换时,瓶颈在哪里?您可以在“步骤指标”选项卡中的“输入/输出”列中看到该列,该列测量每个步骤的输入和输出缓冲区的填充量。通常,通过查找具有完整输入缓冲区(默认为10k行)和空输出缓冲区的步骤来确定瓶颈。因此,如果JS步骤最慢,您将看到其输入缓冲区为10k,上游的所有输入和输出缓冲区也显示10k行,而下游的所有输入和输出缓冲区将为空或几乎为空。
最后,如果您要写入数据库,则预期输出永远不会像在PDI中内部处理行那样快。每秒5k行通常是一个很好的性能,并且很难显着提高。但是,您可以停止使用Table输出步骤,而使用批量加载器。大多数数据库批量加载程序都需要将数据写入文件,但是MySQL可以与FIFO一起使用,在Mac或Linux中(在Windows中不起作用)