2016-09-21 33 views
2

(用於數據集成的Talend OS)Can Talend可以爲MySQL輸出使用動態表名嗎?

是否可以使用動態表名?我已經研究了用戶手冊中的所有資源,儘管他們似乎沒有明確排除它,但似乎無法使其發揮作用。

方案

假設你有一個巨大的1,000,000名列表 - 戴夫·史密斯,大衛·瓊斯,大衛布羅格斯等,這些都存儲在一個表中。

你需要將這些拆分成反映的第一個名字的表,所以你將有一個DB與表的名稱,如「安迪」,「阿德里安」,「亞當」等

當我在

我可以做什麼,沒有問題,是批量導出一個完整的數據集到一個表。我也可以使用tMysqlRow(本身更快)創建我自己的表格。

然後我試圖選擇並吐出數據到其各自的領域,但在這些問題就來了:

  • tMySqlRow可以通過使用變量使用,這樣我就可以將數據插入到相關的表,但它太慢了,它是多餘的。它的運行速度約爲2000行/秒,並且有2000萬行。
  • tMySqlOutput更快,可以做得很好,但需要明確定義表名。使用上下文變量作爲表名不起作用(讀作'Null')。

有人建議查看ETL組件,但它們的定義清楚地表明表名必須用引號定義。

Talend提供如此多的上下文變量使用看起來很奇怪,但看起來不允許你動態地將一個數據集拆分成多個表。這是產品限制嗎,還是僅限於我?

在此先感謝。

編輯 - 加入截圖

context variable available in selection 上下文是打印到窗口在該屏幕截圖(「AB」是所使用的測試上下文值),以表示這個值是相關的,直到它在所聲明的'表' 字段,但是然後返回一個空值

context variable prints to console okay, but is ignored as the table value

+0

您能提供截圖嗎?您在哪裏設置表名的上下文值,以及如何在tMySqlOutput組件中讀取它? –

+0

也許首先要問的問題是:爲什麼要根據名稱創建表?爲什麼不使用分區或好的索引?加入所有表格將很快變得混亂... – tobi6

+0

tobi6 - 名稱只是解釋我正在做的事情的上下文的一種更簡單的方式。我需要匹配目標架構,不幸的是,它使用來自主數據集主鍵的代碼進行分割。 –

回答

3

只是爲了增加這一點,我設法讓這個工作。

enter image description here

  1. tMysqlInput_1檢索來自information_schema 了在一個子作業
  2. 創建的表名這些是隨後傳遞到tHashOutput_1

  3. tHashInput_1然後通過我的輸入工作,這迭代並將這些到tFlowtoIterate組件, 。

  4. 我可以通過調用(String)globalMap.get("row6.TABLE_NAME"))來訪問每個表名,因爲我的tHash模式有一列,我已命名爲'Table_Name'。

我有發生一些動作,由此我使用Table_Name在過濾器中只提取匹配表名該字段,然後將它傳遞給我的yMysqlOutput組件,它看起來像這樣:

enter image description here

我測試過了,它都很好。希望這可以爲將來很多人省下一些時間(或者5分鐘給某個比Talend好得多的人)。

謝謝!

1

克里斯,

我如果你可以使用tELTMysqlMap和一個tELTMysqlOutput組件,你應該可以實現這一點。

tELTMysqlOutput有一個「Use different table name」複選框,您可以在其中指定表名作爲上下文變量或ELTMysMapMap中的輸入字段。

注: - 我還沒有嘗試過。

+0

感謝您的幫助。我已經探索過tELTMysqlOutput,但保留了tMysqlOutput組件,並設法避免使用上下文變量。 –

相關問題