sql >> Base de Datos >  >> RDS >> Oracle

La opción dividir por de sqoop está dando un error al usar una columna derivada en la opción dividir por

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