sql >> Database >  >> RDS >> Oracle

sqoop split by option geeft een fout bij het gebruik van een afgeleide kolom in de split by optie

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




  1. min(kolom) geeft mij geen correcte gegevens van andere kolommen terug

  2. Sql-query voor boomtabel

  3. Kan MySQL een opgeslagen UTC-tijd converteren naar lokale tijdzone?

  4. Hoe items uit deze relatie selecteren?