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

时间:2016-01-15 07:34:21

标签: hadoop hdfs sqoop

我有一个没有任何主键和datemodified / timestamp的表。此表就像一个保存所有数据的事务表(无删除/更新)。

我现在的问题是我想在每次运行增量加载时再次加载整个表格时将数据注入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;

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

3 个答案:

答案 0 :(得分:1)

You can follow these steps

1) The initial load data (previous day data) is in hdfs  - Relation A
2) Import the current data into HDFS using sqoop -- Relation B
3) Use pig Load the above two hdfs directories in relation A and B define schema.
4) Convert them to tuples and join them by all columns
5) The join result will have two tuples in each row((A,B),(A,B)) , fetch the result from join where tuple B is null ((A,D),).
6) Now flatten the join by tuple A you will have new/updated records(A,D).

答案 1 :(得分:1)

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

比方说,有一个表可以保存数据的历史记录,每天都会插入新行,而您只需要将新插入的行添加到hdfs中即可。如果您的来源是sql server,则可以在历史记录表上创建插入或更新触发器。

TransactionHistoryTable

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

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

创建一个表以在主表上发生插入事件时保存记录。保持架构与主表相同,但是您可以在其中添加额外的列。 只要有新行插入到主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]

现在,如果我们在主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;

TriggerHistoryTable

现在,您可以从TriggerHistoryTable中窥探一下,该表将每天都有插入或更新的记录。您还可以使用增量sqoop,因为我们已经为此添加了日期列。将数据导入到hdfs后,您可以每天或每周清除此表。这只是sql server的一个示例。您还可以使用Teradata和oracle等数据库触发器。您还可以设置更新/删除触发器。

答案 2 :(得分:0)

如果您的数据有像rowid这样的字段,您可以使用sqoop参数中的--last-value导入。

请参阅CountDownLatch