Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

sqoop split by option está dando erro ao usar uma coluna derivada na opção split by


Use a subconsulta para agrupar o cálculo row_number e, em seguida, use a coluna derivada na divisão por.
   --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 deve ser determinístico, ou seja, quando executado várias vezes, deve atribuir exatamente o mesmo número a todas as linhas. O que pode acontecer se ORDER BY no OVER não contiver uma coluna ou combinação exclusiva:row_number pode retornar números diferentes para as mesmas linhas. E se você estiver usando no split-by, você obterá duplicação porque a mesma linha pode estar no intervalo de divisão 1, digamos 1-100, no mapper2 sqoop executará a mesma consulta com filtro para o intervalo 2, digamos (101-200 ) a mesma linha pode aparecer também nesse intervalo. O Sqoop executa a mesma consulta em diferentes contêineres (mapeadores) com condições diferentes para obter intervalos divididos em paralelo.

Se Id for int (e muito melhor se for distribuído uniformemente), use esse ID. Por que você pode precisar de row_number é quando é uma coluna STRING. leia isto:https://stackoverflow.com/a/37389134/2700344 , coluna dividida não é necessariamente uma PK