Oracle
 sql >> Datenbank >  >> RDS >> Oracle

sqoop split by option gibt einen Fehler aus, wenn eine abgeleitete Spalte in der split by Option verwendet wird

Verwenden Sie die Unterabfrage, um die Berechnung der Zeilennummer einzuschließen, und verwenden Sie dann die abgeleitete Spalte in der Aufteilung nach.

   --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 sollte deterministisch sein, d.h. wenn es mehrmals ausgeführt wird, sollte es allen Zeilen genau dieselbe Nummer zuweisen. Was kann passieren, wenn ORDER BY in OVER keine eindeutige Spalte oder Kombination enthält:row_number kann unterschiedliche Zahlen für dieselben Zeilen zurückgeben. Und wenn Sie es im Split-By verwenden, erhalten Sie eine Duplizierung, da sich dieselbe Zeile in Split-Bereich 1 befinden kann, beispielsweise 1-100, in Mapper2 führt sqoop dieselbe Abfrage mit Filter für Bereich 2 aus, beispielsweise (101-200 ) dieselbe Zeile kann auch in diesem Bereich erscheinen. Sqoop führt dieselbe Abfrage in verschiedenen Containern (Mappern) mit unterschiedlichen Bedingungen aus, um parallel aufgeteilte Bereiche zu erhalten.

Wenn die ID int ist (und viel besser, wenn sie gleichmäßig verteilt ist), verwenden Sie diese ID. Warum Sie möglicherweise row_number benötigen, ist, wenn es sich um eine STRING-Spalte handelt. Lesen Sie dies:https://stackoverflow.com/a/37389134/2700344 , split-column ist nicht unbedingt ein PK