PySpark数据框:带有条件的完整外部联接

时间:2019-11-21 06:28:43

标签: python python-3.x dataframe pyspark pyspark-dataframes

我有以下2个数据帧-

dataframe_a
+----------------+---------------+
|         user_id|         domain|
+----------------+---------------+
|            josh|     wanadoo.fr|
|        samantha|     randomn.fr|
|             bob|    eidsiva.net|
|           dylan|    vodafone.it|
+----------------+---------------+

dataframe_b
+----------------+---------------+
|         user_id|         domain|
+----------------+---------------+
|            josh|  oldwebsite.fr|
|        samantha|     randomn.fr|
|           dylan|      oldweb.it|
|            ryan|      chicks.it|
+----------------+---------------+

我想做一个完整的外部联接,但是如果我为一个domain得到两个不同的域,则保留dataframe_a的{​​{1}}列中的值。因此,我想要的数据框看起来像-

user_id

我认为我可以做类似的事情-

desired_df
+----------------+---------------+
|         user_id|         domain|
+----------------+---------------+
|            josh|     wanadoo.fr|
|        samantha|     randomn.fr|
|             bob|    eidsiva.net|
|           dylan|    vodafone.it|
|            ryan|      chicks.it|
+----------------+---------------+

但是我担心这是否会给我desired_df = dataframe_a.join(dataframe_b, ["user_id"], how="full_outer").drop(dataframe_b.domain) 所需的数据帧。这是正确的方法吗?

2 个答案:

答案 0 :(得分:3)

您将要使用“ coalesce”。在您当前的解决方案中,ryan将出现在结果数据框中,但其余dataframe_a.domain列的值为空。

joined_df = dataframe_a.join(dataframe_b, ["user_id"], how="full_outer")
+----------------+---------------+---------------+
|         user_id|         domain|         domain|
+----------------+---------------+---------------+
|            josh|     wanadoo.fr|  oldwebsite.fr|
|        samantha|     randomn.fr|     randomn.fr|
|             bob|    eidsiva.net|               |
|           dylan|    vodafone.it|      oldweb.it|
|            ryan|               |      chicks.it|
+----------------+---------------+---------------+

'coalesce'允许您指定首选项顺序,但跳过空值。

import pyspark.sql.functions as F
joined_df = joined_df.withColumn(
  "preferred_domain",
  F.coalesce(dataframe_a.domain, dataframe_b.domain)
)
joined_df = joined_df.drop(dataframe_a.domain).drop(dataframe_b.domain)

给予

+----------------+----------------+
|         user_id|preferred_domain|
+----------------+----------------+
|            josh|      wanadoo.fr|
|        samantha|      randomn.fr|
|             bob|     eidsiva.net|
|           dylan|     vodafone.it|
|            ryan|       chicks.it|
+----------------+----------------+

答案 1 :(得分:0)

不,执行full_outer连接将保留具有与ryan对应的域名的空值的所需数据帧。在上述给定数据帧上的任何连接操作类型都不会提供所需的输出。