Use la subconsulta para envolver el cálculo del número de fila, luego use la columna derivada en la división.
--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
debe ser determinista, significa que cuando se ejecuta varias veces, debe asignar exactamente el mismo número a todas las filas. ¿Qué puede pasar si ORDER BY en OVER no contiene una columna o combinación única:row_number
puede devolver números diferentes para las mismas filas. Y si lo está utilizando en la división, obtendrá la duplicación porque la misma fila puede estar en el rango dividido 1, digamos 1-100, en mapper2 sqoop ejecutará la misma consulta con filtro para el rango 2, digamos (101-200 ) la misma fila puede aparecer también en ese rango. Sqoop ejecuta la misma consulta en diferentes contenedores (mapeadores) con diferentes condiciones para obtener rangos divididos en paralelo.
Si Id es int (y mucho mejor si se distribuye uniformemente), use esa ID. La razón por la que puede necesitar row_number es cuando es una columna STRING. lee esto:https://stackoverflow.com/a/37389134/2700344 , la columna dividida no es necesariamente un PK