这里是一个例子:
要求:
-
Dim_Control(Job_Id、Job_Name、Table_Name、Last_Success、Created_Date)
CREATE TABLE Dim_Control(
job_id BIGINT IDENTITY(1,1) PRIMARY KEY
,job_name NVARCHAR(255)
,table_name NVARCHAR(255)
,last_success DATETIME2(0)
,created_date DATETIME2(0) DEFAULT GETDATE()
)
-
上下文(Last_Success、Job_Name、Table_Name、Current_Run)
步骤:
1.获取上次成功的工作名称和日期:
"Select job_name, table_name, MAX(last_success) as last_success
FROM Dim_Control
WHERE table_name ='Employee'
GROUP BY job_name, table_name;"
2.写日志:
使用 tLogRow 组件 - 您可以选择表格(在表格的单元格中打印值)
3.匹配上下文变量和Dim_Control值
System.out.println("*** Job Name = "+input_row.job_name);
System.out.println("*** Table Name = "+input_row.table_name);
System.out.println("*** Last Success = "+input_row.last_success);
System.out.println("*** (Before) context last_success:" +context.last_success);
context.last_success = TalendDate.formatDate("yyyy-MM-dd HH:mm:ss",input_row.last_success);
context.current_run = TalendDate.formatDate("yyyy-MM-dd HH:mm:ss",TalendDate.getCurrentDate());
context.table_name = input_row.table_name;
System.out.println("*** (After) context last_success:" +context.last_success);
System.out.println("*** (After) context current_run:" +context.current_run);
4.截断目标阶段表
5.向目标阶段表插入新记录:
"SELECT distinct *
FROM dbo.Source_Employee a WITH(NOLOCK)
WHERE FORMAT(ISNULL(a.UpdateDate, a.CreatedDate),'yyyy-MM-dd HH:mm:ss') >= '" + context.last_success +"' OPTION (MAXDOP 32);"
6.向 Dim_Control 插入新的成功作业信息
"INSERT INTO Dim_Control (job_name, table_name, last_success)
VALUES ('"+context.job_name+"', '"+context.table_name+"', '"+context.current_run+"' ); "
7.合并阶段和主目标表
"MERGE dbo.Main_Target_Table t1
USING dbo.Stage_Target_Table t2
ON t1.Id = t2.Id
WHEN MATCHED
THEN UPDATE SET Id = t2.Id, Name= t2.Name
WHEN NOT MATCHED BY TARGET
THEN INSERT ( Id, Name ) VALUES ( t2.Id, t2.Name);"
- 合并不应包括删除部分,ID 应为主键
- 所有上下文类型都是字符串
- 默认 Talend 日期格式:2021 年 6 月 28 日星期四 00:00:00 EET
- 也可以看Rohan's Video
Workflow of ETL