使用没有主键或时间戳的 sqoop 增量数据加载

MMa*_*ati 5 hadoop hdfs sqoop

我有一个没有任何主键和日期修改/时间戳的表。该表就像一个事务表,不断保存所有数据(无删除/更新)。

我现在的问题是,每次运行增量加载时,我都想将数据注入 HDFS,而无需再次加载整个表。

如果我的表有主键,下面的代码会获取导入到 HDFS 的最新行。

sqoop job \
--create tb_w_PK_DT_append \
-- \
import \
--connect jdbc:mysql://10.217.55.176:3306/SQOOP_Test \
--username root \
--incremental append \
--check-column P_id \
--last-value 0 \
--target-dir /data \
--query "SELECT * FROM tb_w_PK_DT WHERE \$CONDITIONS" \
-m 1;
Run Code Online (Sandbox Code Playgroud)

无需修改任何主键或日期即可获取最新导入数据的任何解决方案。

vik*_*ana 2

我知道我回答这个问题有点晚了,但只是想分享一下以供参考。如果有一种情况,您的源表上没有主键列或日期列,并且您只想将增量数据 sqoop 到 hdfs。

假设有一些表保存数据历史记录和每天插入的新行,您只需要将新插入的行存储到 hdfs 中。如果您的源是 sql server,您可以在历史表上创建插入或更新触发器。

交易历史表

您可以创建一个插入触发器,如下所示:

CREATE TRIGGER transactionInsertTrigger 
ON  [dbo].[TransactionHistoryTable]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
INSERT INTO [dbo].[TriggerHistoryTable]
(
 product ,price,payment_type,name,city,state,country,Last_Modified_Date
 )
SELECT
 product,price,payment_type,name,city,state,country,GETDATE() as Last_Modified_Date
FROM
inserted i
END
Run Code Online (Sandbox Code Playgroud)

创建一个表来保存主表上发生插入事件时的记录。保持架构与主表相同,但是您可以向其中添加额外的列。每当有任何新行插入到主 TransactionHistoryTable 中时,上面的触发器就会在表中插入一行。

CREATE TABLE [dbo].[TriggerHistoryTable](
    [product] [varchar](20) NULL,
    [price] [int] NULL,
    [payment_type] [varchar](20) NULL,
    [name] [varchar](20) NULL,
    [city] [varchar](20) NULL,
    [state] [varchar](20) NULL,
    [country] [varchar](20) NULL,
    [Last_Modified_Date] [date] NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

现在,如果我们将两行新行插入到主 TransactionHistoryTable 中,由于此插入事件,我们的触发器被触发,并将这两行也与主 TransactionHistoryTable 一起插入到 TriggerHistoryTable 中

insert into [Transaction_db].[dbo].[TransactionHistoryTable]
values
('Product3',2100,'Visa','Cindy' ,'Kemble','England','United Kingdom')
,('Product4',50000,'Mastercard','Tamar','Headley','England','United Kingdom')
;

select * from TriggerHistoryTable;
Run Code Online (Sandbox Code Playgroud)

触发历史表

现在您可以从 TriggerHistoryTable 中进行 sqoop,该表每天都会插入或更新记录。您也可以使用增量 sqoop,因为我们已向其中添加了日期列。将数据导入 HDFS 后,您可以每天或每周清除此表。这只是 sql server 的一个例子。您也可以使用 Teradata 和 oracle 以及其他数据库来使用触发器。您还可以设置更新/删除触发器。