我是使用Talend的新手。 我想在ETL中使用delta加载。 我从Mysql数据源中提取并加载到Postgresql数据库中。 Mysql数据源有created_at和updated_at时间戳,我想用它来提取新数据或更新数据。 我之前已经使用SSIS在Sql Server中实现了这个功能。 我不知道如何使用Talend实现。 有没有人使用Talend实现带有时间戳的delta负载? 提前致谢。
答案 0 :(得分:2)
由于你已经提交了确定三角洲的日期,因此很容易。 有两个文件一个具有当前日期(当作业流程开始时)。另一个文件上次运行日期为低日期19000101.在第一次加载运行作业并从上次运行日期文件中读取日期时,将其作为where子句检查源数据时间戳col>运行日期并运行作业。接下来将当前日期文件值移动到下一个运行日期文件。在增量运行中再次运行相同的过程。因此,您将获得增量记录。
答案 1 :(得分:1)
我为其中一个项目做了。 首先,我们将创建一个日志表,如Job_id,Job_name,start_time,end_time,status等列。 只要你的工作运行一次,你就需要在工作结束时更新这个表。
对于下一次运行,首先我们必须检查上一次成功上次成功完成的时间,从上一次作业开始时间开始,并放入一个变量。
在下面给出表输入的条件,如
created_at>上次开始时间的变量
见下图 或
updated_at>上次开始时间的变量
答案 2 :(得分:0)
存在两个选项-这个答案并非特定于时间戳,但仍会有所帮助。
您可以将内置CDC直接用于某些数据库(在Talend之外),例如SQL Server和Oracle。可能与您的情况无关。
您可以对某些数据库(Talend内部)使用内置CDC。需要订阅版本。包括MySQL,Oracle,DB2,PostgreSQL,Sybase,MS SQL Server,Informix,Ingres和Teradata。 https://help.talend.com/reader/4UeRbZs9GU5n8b9nm3hUrQ/8yztvpROOkQauOWwo_0twA
您可以通过SQL和Java(创建自定义例程)或包含的组件tAddCDCRow来遍历手动方法。这将涉及将MD5哈希值用于键值或非键值。 *始终对非关键字段使用哈希。
A.组合键的哈希值,包括比较中的其余字段。
B.在比较中包括所有关键字段,其余部分使用哈希。
C.将一个哈希用于键组合,将另一个哈希用于其余字段。
如果使用tAddCDCRow,则将一个组件用于组合键,将另一个用于其余字段。当然,如果仅散列密钥,则仅需要一个组件。 如果使用自定义Java函数,请根据需要调用一次或两次。
哈希Java函数:
master
|
* New merge commit
|\
| * B'
| \
| ...
* R
|\
| * B
| ...
|/
* A
这是另一个代码示例的链接:https://community.talend.com/t5/Design-and-Development/sha1-hash-key/td-p/109750。
比较:使用哈希(可能还有其他)字段比较旧信息和新信息。在键字段(或相关散列)和非键字段的散列上使用完全外部联接。当在新的而不是旧的一侧找到空值时,需要插入。如果在旧的而不是新的一侧找到了null,则需要删除(或根据需要将其忽略)。如果没有null,请执行更新。
答案 3 :(得分:0)
这里有一个例子:
要求:
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 组件 - 您可以更喜欢 Table(在表格的单元格中打印值)
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.Truncate Target Stage Table
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);"