Câu hỏi này không phải là mới, tuy nhiên tôi đang tìm thấy hành vi đáng ngạc nhiên trong Spark. Tôi cần phải thêm một cột ID hàng vào một DataFrame. Tôi đã sử dụng phương thức DataFrame monotonically_increasing_id() và nó cung cấp cho tôi một col bổ sung của các ID hàng đơn (không phải là liên tiếp bằng cách này, nhưng là duy nhất).Tôi làm cách nào để thêm cột liên tục của id hàng vào Spark DataFrame?
Vấn đề tôi gặp phải là khi tôi lọc DataFrame, các Id hàng trong DataFrame kết quả được gán lại. Hai DataFrames được hiển thị bên dưới.
một trong những đầu tiên là DataFrame ban đầu với các ID hàng bổ sung như sau:
df.withColumn("rowId", monotonically_increasing_id())
các DataFrame thứ hai là một thu được sau khi lọc trên col P qua
df.filter(col("P"))
.
Vấn đề được minh họa bằng các ROWID cho ID Khách hàng 169, đó là 5 trong DataFrame ban đầu, nhưng sau khi lọc mà ROWID (5) đã được tái giao cho custmId 773 khi ID Khách hàng 169 được lọc ra! Tôi không biết tại sao đây là hành vi mặc định.
Tôi muốn rowIds
là "dính"; nếu tôi xóa các hàng khỏi DataFrame, tôi không muốn ID của họ "được sử dụng lại", tôi muốn chúng đi cùng với các hàng của chúng. Có thể làm điều đó không? Tôi không thấy bất kỳ cờ nào để yêu cầu hành vi này từ phương thức monotonically_increasing_id
.
+---------+--------------------+-------+
| custId | features| P |rowId|
+---------+--------------------+-------+
|806 |[50,5074,...| true| 0|
|832 |[45,120,1...| true| 1|
|216 |[6691,272...| true| 2|
|926 |[120,1788...| true| 3|
|875 |[54,120,1...| true| 4|
|169 |[19406,21...| false| 5|
after filtering on P:
+---------+--------------------+-------+
| custId| features| P |rowId|
+---------+--------------------+-------+
| 806|[50,5074,...| true| 0|
| 832|[45,120,1...| true| 1|
| 216|[6691,272...| true| 2|
| 926|[120,1788...| true| 3|
| 875|[54,120,1...| true| 4|
| 773|[3136,317...| true| 5|
Bạn có thể chia sẻ mã đầy đủ của mình để tạo hai DataFrames mẫu không? Đối với những gì nó có giá trị, điều này có thể là do tối ưu hóa truy vấn SQL diễn ra trong đó các giai đoạn bản đồ "độc lập" có thể được sắp xếp lại. –
Hamel, thực sự không có biến đổi hoặc hành động nào khác so với tôi đã đăng. Các khung dữ liệu được hiển thị là kết quả của df.show(). Bạn có thể dễ dàng tạo lại hành vi này, tạo một khung dữ liệu và thêm một cột ID hàng như trên, sau đó thêm một cột boolean ngẫu nhiên vào nó. Sau đó lọc trên cột đó và xem cách các ID hàng bạn nhận được từ tăng đơn điệu được "tái sử dụng" như tôi mô tả. – Kai
@Kai Tôi thực sự sẽ thêm rằng cách đơn giản nhất để tái tạo nó là chỉ sử dụng một phân vùng duy nhất. – zero323