Oracle
 sql >> Base de données >  >> RDS >> Oracle

sqoop split by option génère une erreur lors de l'utilisation d'une colonne dérivée dans l'option split by

Utilisez la sous-requête pour envelopper le calcul du numéro de ligne, puis utilisez la colonne dérivée dans le fractionnement.

   --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 doit être déterministe, cela signifie que lorsqu'il est exécuté plusieurs fois, il doit attribuer exactement le même numéro à toutes les lignes. Que peut-il se passer si ORDER BY dans OVER ne contient pas de colonne ou de combinaison unique :row_number peut renvoyer des nombres différents pour les mêmes lignes. Et si vous l'utilisez dans le split-by, vous obtiendrez une duplication car la même ligne peut être dans la plage fractionnée 1, disons 1-100, dans mapper2 sqoop exécutera la même requête avec le filtre pour la plage 2, disons (101-200 ) la même ligne peut également apparaître dans cette plage. Sqoop exécute la même requête dans différents conteneurs (mappers) avec des conditions différentes pour obtenir des plages fractionnées en parallèle.

Si Id est int (et bien mieux s'il est uniformément distribué), utilisez cet ID. La raison pour laquelle vous pouvez avoir besoin de row_number est lorsqu'il s'agit d'une colonne STRING. lisez ceci :https://stackoverflow.com/a/37389134/2700344 , split-column n'est pas nécessairement un PK