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