Använd underfråga för att avsluta radnummerberäkningen, använd sedan härledd kolumn i uppdelningen.
--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
bör vara deterministisk, det betyder att när den körs flera gånger, bör den tilldela exakt samma nummer till alla rader. Vad kan hända om ORDER BY i OVER inte innehåller en unik kolumn eller kombination:row_number
kan returnera olika nummer för samma rader. Och om du använder det i split-by kommer du att få duplicering eftersom samma rad kan vara i delat intervall 1, säg 1-100, i mapper2 kommer sqoop att köra samma fråga med filter för intervall 2, säg (101-200 ) samma rad kan också visas i det intervallet. Sqoop kör samma fråga i olika behållare (mappare) med olika villkor för att få delade intervall parallellt.
Om Id är int (och mycket bättre om det är jämnt fördelat), använd det ID:t. Varför du kan behöva radnummer är när det är STRING kolumn. läs detta:https://stackoverflow.com/a/37389134/2700344 , delad kolumn är inte nödvändigtvis en PK