Talend 可以为 MySQL 输出使用动态 table 名称吗?
Can Talend use a dynamic table name for MySQL output?
(Talend OS 用于数据集成)
是否可以使用动态 table 名称?我已经研究了用户手册中的所有资源,虽然其中 none 似乎明确排除了它,但我似乎无法让它工作。
场景
假设您有一个包含 1,000,000 个名字的庞大列表 - Dave Smith、Dave Jones、Dave Bloggs 等。这些都存储在一个 table。
您需要将它们拆分为反映名字的 tables,因此您将拥有一个具有 tables 名称的 DB,例如 'Andy'、'Adrian' , 'Adam' 等
我在哪里
我能毫无问题地做的是将完整数据集批量导出到 table。我还可以遍历该字段以使用 tMysqlRow
创建我的个人 table(这本身要快得多)。
然后我尝试 select 并将数据吐出到各自的字段中,但遇到了这些问题:
- tMySqlRow 可以与变量一起使用,所以我可以将数据插入到相关的 table,但是它太慢了,是多余的。运营2000左右rows/sec,还有2000万左右做。
- tMySqlOutput 更快,并且可以很好地完成此操作,但需要明确定义 table 名称。使用上下文变量作为 table 名称不起作用(读取为 'Null')。
建议查看 ETL 组件,但它们的定义明确表明 table 名称必须用引号引起来。
Talend 提供如此多的上下文变量使用似乎真的很奇怪,但似乎不允许您动态地将一个数据集拆分为多个 table。是产品限制,还是我的限制?
提前致谢。
编辑 - 添加了屏幕截图
上下文打印到此屏幕截图中的 window('AB' 是使用的测试上下文值)以表明该值在 'Table' 字段中声明之前一直是相关的,但随后returns 空值
克里斯,
如果您可以将 tELTMysqlMap 与 tELTMysqlOutput 组件结合使用,您应该能够实现。
tELTMysqlOutput 有一个 "Use different table name" 复选框,您可以在其中将 Table 名称指定为上下文变量或来自 ELTMysqlMap 的输入字段。
注意:- 我还没有尝试过。
补充一下,我已经设法让它工作了。
- tMysqlInput_1 从
information_schema
检索 table 个名字
在子作业中创建的
然后将这些传递给 tHashOutput_1。
tHashInput_1 然后将这些提供给 tFlowtoIterate
组件,
遍历我的输入作业。
然后我可以通过调用 (String)globalMap.get("row6.TABLE_NAME"))
访问每个 table 名称,因为我的 tHash 模式有一个列,我将其命名为 'Table_Name'.
我执行了一些操作,借此我在过滤器中使用 Table_Name
来仅提取与 table 名称匹配的字段,然后将其传递给我的 yMysqlOutput 组件,它看起来像这样:
我已经测试过了,一切正常。希望这可以为将来解决这个问题的人节省很多时间(或者对 Talend 比我好得多的人节省 5 分钟!)。
谢谢!
(Talend OS 用于数据集成)
是否可以使用动态 table 名称?我已经研究了用户手册中的所有资源,虽然其中 none 似乎明确排除了它,但我似乎无法让它工作。
场景
假设您有一个包含 1,000,000 个名字的庞大列表 - Dave Smith、Dave Jones、Dave Bloggs 等。这些都存储在一个 table。
您需要将它们拆分为反映名字的 tables,因此您将拥有一个具有 tables 名称的 DB,例如 'Andy'、'Adrian' , 'Adam' 等
我在哪里
我能毫无问题地做的是将完整数据集批量导出到 table。我还可以遍历该字段以使用 tMysqlRow
创建我的个人 table(这本身要快得多)。
然后我尝试 select 并将数据吐出到各自的字段中,但遇到了这些问题:
- tMySqlRow 可以与变量一起使用,所以我可以将数据插入到相关的 table,但是它太慢了,是多余的。运营2000左右rows/sec,还有2000万左右做。
- tMySqlOutput 更快,并且可以很好地完成此操作,但需要明确定义 table 名称。使用上下文变量作为 table 名称不起作用(读取为 'Null')。
建议查看 ETL 组件,但它们的定义明确表明 table 名称必须用引号引起来。
Talend 提供如此多的上下文变量使用似乎真的很奇怪,但似乎不允许您动态地将一个数据集拆分为多个 table。是产品限制,还是我的限制?
提前致谢。
编辑 - 添加了屏幕截图
克里斯,
如果您可以将 tELTMysqlMap 与 tELTMysqlOutput 组件结合使用,您应该能够实现。
tELTMysqlOutput 有一个 "Use different table name" 复选框,您可以在其中将 Table 名称指定为上下文变量或来自 ELTMysqlMap 的输入字段。
注意:- 我还没有尝试过。
补充一下,我已经设法让它工作了。
- tMysqlInput_1 从
information_schema
检索 table 个名字 在子作业中创建的 然后将这些传递给 tHashOutput_1。
tHashInput_1 然后将这些提供给
tFlowtoIterate
组件, 遍历我的输入作业。然后我可以通过调用
(String)globalMap.get("row6.TABLE_NAME"))
访问每个 table 名称,因为我的 tHash 模式有一个列,我将其命名为 'Table_Name'.
我执行了一些操作,借此我在过滤器中使用 Table_Name
来仅提取与 table 名称匹配的字段,然后将其传递给我的 yMysqlOutput 组件,它看起来像这样:
我已经测试过了,一切正常。希望这可以为将来解决这个问题的人节省很多时间(或者对 Talend 比我好得多的人节省 5 分钟!)。
谢谢!