Utilizza la sottoquery per eseguire il wrapping del calcolo row_number, quindi utilizza la colonna derivata nella suddivisione per.
--query "select col1, ... colN, RANGEGROUP
from (select t.*, row_number() OVER (order by t.item_id ) AS RANGEGROUP
from table t ) s
where 1=1 and \$CONDITIONS"
row_number
dovrebbe essere deterministico, significa che se eseguito più volte, dovrebbe assegnare esattamente lo stesso numero a tutte le righe. Cosa può succedere se ORDER BY in OVER contiene una colonna o una combinazione non univoca:row_number
può restituire numeri diversi per le stesse righe. E se lo stai usando nello split-by, otterrai la duplicazione perché la stessa riga può essere nell'intervallo diviso 1, diciamo 1-100, in mapper2 sqoop eseguirà la stessa query con il filtro per l'intervallo 2, diciamo (101-200 ) la stessa riga può apparire anche in quell'intervallo. Sqoop esegue la stessa query in contenitori diversi (mapper) con condizioni diverse per ottenere intervalli divisi in parallelo.
Se Id è int (e molto meglio se è distribuito uniformemente), usa quell'ID. Il motivo per cui potresti aver bisogno di row_number è quando è la colonna STRING. leggi questo:https://stackoverflow.com/a/37389134/2700344 , la colonna divisa non è necessariamente una PK