Použijte poddotaz k zabalení výpočtu row_number a poté použijte odvozený sloupec v rozdělení podle.
--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
by měl být deterministický, to znamená, že když se provede vícekrát, měl by všem řádkům přiřadit přesně stejné číslo. Co se může stát, pokud ORDER BY v OVER neobsahuje jedinečný sloupec nebo kombinaci:row_number
může vrátit různá čísla pro stejné řádky. A pokud jej používáte v split-by, dostanete duplikaci, protože stejný řádek může být v rozděleném rozsahu 1, řekněme 1-100, v mapper2 sqoop provede stejný dotaz s filtrem pro rozsah 2, řekněme (101-200 ) stejný řádek se může objevit také v tomto rozsahu. Sqoop spustí stejný dotaz v různých kontejnerech (mapovačích) s různými podmínkami, aby získal rozdělené rozsahy paralelně.
Pokud je Id int (a mnohem lepší, když je rovnoměrně rozloženo), použijte toto ID. Je možné, že budete potřebovat row_number, když je to sloupec STRING. přečtěte si toto:https://stackoverflow.com/a/37389134/2700344 , rozdělený sloupec není nutně PK