Sử dụng truy vấn con để bao bọc phép tính row_number, sau đó sử dụng cột dẫn xuất trong phần tách.
--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
nên có tính xác định, có nghĩa là khi được thực thi nhiều lần, nó phải gán chính xác cùng một số cho tất cả các hàng. Điều gì có thể xảy ra nếu ORDER BY trong OVER không chứa cột hoặc kết hợp duy nhất:row_number
có thể trả về các số khác nhau cho các hàng giống nhau. Và nếu bạn đang sử dụng nó trong phạm vi phân tách, bạn sẽ nhận được sự trùng lặp vì cùng một hàng có thể nằm trong phạm vi phân tách 1, giả sử 1-100, trong mapper2 sqoop sẽ thực hiện cùng một truy vấn với bộ lọc cho phạm vi 2, chẳng hạn (101-200 ) cùng một hàng cũng có thể xuất hiện trong phạm vi đó. Sqoop chạy cùng một truy vấn trong các vùng chứa (trình liên kết) khác nhau với điều kiện khác nhau để nhận các phạm vi phân chia song song.
Nếu Id là int (và tốt hơn nhiều nếu nó được phân phối đồng đều), hãy sử dụng ID đó. Tại sao bạn có thể cần row_number khi nó là cột STRING. đọc phần này: https://stackoverflow.com/a/37389134/2700344 , cột tách không nhất thiết phải là PK