火花数据框中没有重复列的外部联接

时间:2017-10-02 12:29:49

标签: apache-spark apache-spark-sql spark-dataframe

我有两个数据框,我正在进行外连接。 因此,当我进行外连接时,它会留下许多具有相同标题的重复行。

这是我的df1:

+----------+------+---------+--------+------+
|     OrgId|ItemId|segmentId|Sequence|Action|
+----------+------+---------+--------+------+
|4295877341|   136|        4|       1|  I|!||
|4295877346|   136|        4|       1|  I|!||
|4295877341|   138|        2|       1|  I|!||
|4295877341|   141|        4|       1|  I|!||
|4295877341|   143|        2|       1|  I|!||
|4295877341|   145|       14|       1|  I|!||
| 123456789|   145|       14|       1|  I|!||
+----------+------+---------+--------+------+

这是我的df2:

+----------+------+---------+--------+------+
|     OrgId|ItemId|segmentId|Sequence|Action|
+----------+------+---------+--------+------+
|4295877343|   149|       15|       2|  I|!||
|4295877341|   136|     null|    null|  I|!||
| 123456789|   145|       14|       1|  D|!||
|4295877341|   138|       11|      22|  I|!||
|4295877341|   141|       10|       1|  I|!||
|4295877341|   143|        1|       1|  I|!||
+----------+------+---------+--------+------+

现在我正在加入两个数据框,以便低于预期的输出。

+----------+------+---------+--------+------+
|     OrgId|ItemId|segmentId|Sequence|Action|
+----------+------+---------+--------+------+
|4295877346|   136|        4|       1|  I|!||
|4295877341|   145|       14|       1|  I|!||
|4295877343|   149|       15|       2|  I|!||
|4295877341|   136|     null|    null|  I|!||
|4295877341|   138|       11|      22|  I|!||
|4295877341|   141|       10|       1|  I|!||
|4295877341|   143|        1|       1|  I|!||
+----------+------+---------+--------+------+

请注意,在输出中我更新数据框1,数据框2记录匹配记录和df2中的新记录也在输出中,如果df1中的任何记录与df2不匹配也将在输出数据框。

这是我尝试过的。

首先我试过这个。

val df3 = df1.join(latestForEachKey, Seq("OrgId", "ItemId"), "outer")

然后我得到了以下输出..

+----------+------+---------+--------+------+---------+--------+------+
|     OrgId|ItemId|segmentId|Sequence|Action|segmentId|Sequence|Action|
+----------+------+---------+--------+------+---------+--------+------+
|4295877346|   136|        4|       1|  I|!||     null|    null|  null|
|4295877341|   145|       14|       1|  I|!||     null|    null|  null|
|4295877343|   149|     null|    null|  null|       15|       2|  I|!||
|4295877341|   136|        4|       1|  I|!||     null|    null|  I|!||
| 123456789|   145|       14|       1|  I|!||       14|       1|  D|!||
|4295877341|   138|        2|       1|  I|!||       11|      22|  I|!||
|4295877341|   141|        4|       1|  I|!||       10|       1|  I|!||
|4295877341|   143|        2|       1|  I|!||        1|       1|  I|!||
+----------+------+---------+--------+------+---------+--------+------+

然后我尝试重命名df2列重命名并在代码下面执行。

val df3 = df1.join(latestForEachKey, Seq("OrgId", "ItemId"), "outer")
      .select($"OrgId", $"ItemId",
        when($"segmentId_1".isNotNull, $"segmentId_1").otherwise($"segmentId").as("segmentId"),
        when($"Sequence_1".isNotNull, $"Sequence_1").otherwise($"Sequence").as("Sequence"),
        when($"Action_1".isNotNull, $"Action_1").otherwise($"Action").as("Action")).filter(!$"Action".contains("D"))

现在这给了我正确的输出,但是我必须在条件时这样写。

我有60列的原始数据集,所以它可能是问题。

请提出一些建议。

0 个答案:

没有答案