web-dev-qa-db-ja.com

2つのデータフレームを比較し、scalaで異なる列を印刷する方法

ここには2つのデータフレームがあります。

予想されるデータフレーム:

+------+---------+--------+----------+-------+--------+
|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|
+------+---------+--------+----------+-------+--------+

実際のデータフレーム:

+------+---------+--------+----------+-------+--------+
|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|
+------+---------+--------+----------+-------+--------+

2つのデータフレームの違いは次のとおりです。

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

例外関数df1.except(df2)を使用していますが、これに関する問題は、異なる行全体を返すことです。必要なのは、その行内でどの列が異なるかを確認することです(この場合、「emp_name」の「romin」と「romino」は異なります)。私たちはそれに関して非常に困難を抱えており、どんな助けも素晴らしいでしょう。

16
rominoushana

上記の質問で説明されているシナリオから、行ではなく列で違いを見つけなければならないようです。

そのため、ここで選択的な差異を適用する必要があります。これにより、異なる値を持つ列と値が提供されます。

ここで、選択的な違いを適用するには、次のようなコードを記述する必要があります。

  1. まず、予想されるデータフレームと実際のデータフレームで列を見つける必要があります。

    val columns = df1.schema.fields.map(_。name)

  2. 次に、列ごとに差を見つけなければなりません。

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

  3. 最後に、どの列に異なる値が含まれているかを調べる必要があります。

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

そして、異なる値を含む列のみを取得します。このような:

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

これがお役に立てば幸いです!

33
himanshuIIITian