【发布时间】:2017-01-12 15:39:46
【问题描述】:
我有一个巨大的 oracle 表(事务),我的 oracle 表中的数据在“客户 ID”列上存在倾斜数据,因此少数映射器需要数小时才能完成工作,而其他映射器则在分钟。我看不到任何其他选项来避免数据倾斜,因为这是唯一可以拆分的列。我们可以结合其他列,如客户 ID、批次 ID、SEQ NUM 来进行多列拆分,但我知道 sqoop 不支持多列拆分。
我的目标是提取特定时期的交易数据(即一个月数据的唯一批次日期)。
我在 sqoop 中使用 10 个映射器尝试了以下选项。
--split-by "my column name" //for example customer id
--where "my query condition" //for example batch date
现在我正在考虑使用 ROWID,它可能会在映射器之间平均拆分行。我想过使用边界查询来获取 MIN & MAX ROW ID。下面是我要使用的 Sqoop 命令。
sqoop import \
--table Transaction \
--split-by ROWID \
--where "BATCH_DT=TO_DATE('03/31/2016','MM/DD/YYYY')" \
--boundary-query "SELECT MIN(ROWID) AS MIN, MAX(ROWID) AS MAXL FROM Transaction WHERE BATCH_DT=TO_DATE('03/31/2016','MM/DD/YYYY') GROUP BY CUSTOMERID, BATCHNO,BATCHSEQNO " \
--num-mappers 10 \
--target-dir /user/trans
需要建议这是正确的选择还是有其他方法。
我也想知道我们是否可以使用多重拆分列名。
【问题讨论】:
标签: sqoop