2017-06-02 21 views
5

Chúng tôi có hai khung dữ liệu ở đây:Làm thế nào để so sánh hai cột dataframe và in mà là khác nhau trong scala

các dataframe dự kiến:

+------+---------+--------+----------+-------+--------+ 
|emp_id| emp_city|emp_name| emp_phone|emp_sal|emp_site| 
+------+---------+--------+----------+-------+--------+ 
|  3| Chennai| rahman|9848022330| 45000|SanRamon| 
|  1|Hyderabad|  ram|9848022338| 50000|  SF| 
|  2|Hyderabad| robin|9848022339| 40000|  LA| 
|  4| sanjose| romin|9848022331| 45123|SanRamon| 
+------+---------+--------+----------+-------+--------+ 

và khung dữ liệu thực tế:

+------+---------+--------+----------+-------+--------+ 
|emp_id| emp_city|emp_name| emp_phone|emp_sal|emp_site| 
+------+---------+--------+----------+-------+--------+ 
|  3| Chennai| rahman|9848022330| 45000|SanRamon| 
|  1|Hyderabad|  ram|9848022338| 50000|  SF| 
|  2|Hyderabad| robin|9848022339| 40000|  LA| 
|  4| sanjose| romino|9848022331| 45123|SanRamon| 
+------+---------+--------+----------+-------+--------+ 

sự khác biệt giữa hai khung dữ liệu bây giờ là:

+------+--------+--------+----------+-------+--------+ 
|emp_id|emp_city|emp_name| emp_phone|emp_sal|emp_site| 
+------+--------+--------+----------+-------+--------+ 
|  4| sanjose| romino|9848022331| 45123|SanRamon| 
+------+--------+--------+----------+-------+--------+ 

Chúng tôi đang sử dụng chức năng ngoại trừ df1.except (df2), tuy nhiên vấn đề với điều này là, nó trả về toàn bộ các hàng khác nhau. Những gì chúng ta muốn là xem các cột nào khác nhau trong hàng đó (trong trường hợp này là "romin" và "romino" từ "emp_name" khác nhau). Chúng tôi đã gặp khó khăn to lớn với nó và bất kỳ sự trợ giúp nào cũng sẽ rất tuyệt vời.

+0

Tham gia bên trong và giữ cả hai tên người dùng và xóa tất cả các hàng mà cả hai đều giống nhau. –

+0

Bạn có thể đưa ra các giả định về dữ liệu không? ví dụ bạn có thể giả sử emp_id là duy nhất? hoặc thậm chí tốt hơn phải giống nhau và chỉ xác thực trên dữ liệu của nó là có liên quan? nếu không, tại sao hàng này khác nhau trong emp_name và không hoàn toàn khác với một trong các emp_id khác –

+0

Câu hỏi tương tự https://stackoverflow.com/questions/44807450/how-to-compare-two-dataframes-and-print-extra- hàng-trong-một-trong-hai-datafram/44810081 # 44810081 –

Trả lời

7

Từ kịch bản được mô tả trong câu hỏi trên, có vẻ như sự khác biệt đó phải được tìm thấy giữa các cột chứ không phải các hàng.

Vì vậy, để thực hiện điều đó, chúng tôi cần áp dụng sự khác biệt chọn lọc tại đây, điều này sẽ cung cấp cho chúng tôi các cột có giá trị khác nhau cùng với các giá trị.

Bây giờ, để áp dụng sự khác biệt có chọn lọc, chúng ta phải viết mã một cái gì đó như thế này:

  1. Đầu tiên chúng ta cần phải tìm ra các cột trong dataframes mong đợi và thực tế.

    cột val = df1.schema.fields.map (_. Tên)

  2. Sau đó, chúng ta phải tìm sự khác biệt theo cột.

    val selectiveDifferences = columns.map (col => df1.select (col) .except (df2.select (col)))

  3. Cuối cùng chúng ta cần phải tìm ra các cột chứa các giá trị khác nhau.

    selectiveDifferences.map (diff => {if (diff.count> 0) diff.show})

Và, chúng tôi sẽ chỉ nhận được các cột chứa giá trị khác nhau. Như thế này:

+--------+ 
|emp_name| 
+--------+ 
| romino| 
+--------+ 

Tôi hy vọng điều này sẽ hữu ích!

+0

Điều này là hoàn hảo @himanshullTian. Cảm ơn nhiều.Tôi đã có hai bước đầu tiên, nhưng đã bỏ lỡ bước quan trọng cuối cùng! Câu hỏi tiếp theo là, nếu có thêm hàng trong khung dữ liệu thực tế thì sao? (dự kiến ​​có 4 hàng và thực tế có 5). Làm thế nào để chúng ta phân biệt và in toàn bộ hàng thay vì in mỗi cột ra? – rominoushana

Các vấn đề liên quan