Oracle
 sql >> Database >  >> RDS >> Oracle

sqoop diviso per opzione sta dando un errore durante l'utilizzo di una colonna derivata nell'opzione divisa per

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