Gebruik een subquery om de berekening van het rijnummer af te ronden en gebruik vervolgens de afgeleide kolom in de split-by.
--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
moet deterministisch zijn, het betekent dat wanneer het meerdere keren wordt uitgevoerd, het exact hetzelfde nummer aan alle rijen moet toewijzen. Wat kan er gebeuren als ORDER BY in de OVER geen unieke kolom of combinatie bevat:row_number
kan verschillende getallen retourneren voor dezelfde rijen. En als je het in de split-by gebruikt, krijg je duplicatie omdat dezelfde rij in gesplitst bereik 1 kan zijn, zeg 1-100, in mapper2 zal sqoop dezelfde query uitvoeren met filter voor bereik 2, zeg (101-200 ) dezelfde rij kan ook in dat bereik voorkomen. Sqoop voert dezelfde query uit in verschillende containers (mappers) met verschillende voorwaarden om parallel gesplitste bereiken te krijgen.
Als Id int is (en veel beter als het gelijk verdeeld is), gebruik dan die ID. De reden waarom u row_number nodig heeft, is wanneer het de STRING-kolom is. lees dit:https://stackoverflow.com/a/37389134/2700344 , gesplitste kolom is niet per se een PK