我有以下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)
所需的数据帧。这是正确的方法吗?
答案 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对应的域名的空值的所需数据帧。在上述给定数据帧上的任何连接操作类型都不会提供所需的输出。