Apache spark pyspark数据帧中值的条件替换

Apache spark pyspark数据帧中值的条件替换,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我的spark数据框如下: +----------+-------------+--------------+------------+----------+-------------------+ | part| company| country| city| price| date| +----------+-------------+--------------+------------+----------

我的spark数据框如下:

+----------+-------------+--------------+------------+----------+-------------------+
|      part|      company|       country|        city|     price|               date|
+----------+-------------+--------------+------------+----------+-------------------+
| 52125-136|  Brainsphere|          null|       Braga|   493.94€|2016-05-10 11:13:43|
| 70253-307|Chatterbridge|         Spain|   Barcelona|   969.29€|2016-05-10 13:06:30|
| 50563-113|     Kanoodle|         Japan|     Niihama| ¥72909.95|2016-05-10 13:11:57|
|52380-1102|    Flipstorm|        France|    Nanterre|   794.84€|2016-05-10 13:19:12|
| 54473-578|  Twitterbeat|        France|      Annecy|   167.48€|2016-05-10 15:09:46|
| 76335-006|        Ntags|      Portugal|      Lisbon|   373.07€|2016-05-10 15:20:22|
| 49999-737|     Buzzbean|       Germany|  Düsseldorf|    861.2€|2016-05-10 15:21:51|
| 68233-011|    Flipstorm|        Greece|      Athens|   512.89€|2016-05-10 15:22:03|
| 36800-952|       Eimbee|        France|      Amiens|   219.74€|2016-05-10 21:22:46|
| 16714-295|      Teklist|          null|      Arnhem|    624.4€|2016-05-10 21:57:15|
| 42254-213|   Thoughtmix|      Portugal|     Amadora|   257.99€|2016-05-10 22:01:04|
从这些列中,只有country列具有空值。我要做的是用右边城市对应的国家填充空值。数据帧很大,有些情况下Braga(例如)拥有它所属的国家,有些情况下则不是这样


那么,如何基于右侧的城市列在country列中填充这些空值,同时利用Spark的并行计算?

使用Spark中的coalesce函数从列列表中获取第一个
非空值

示例:

df.show()
#+--------+---------+
#| country|     city|
#+--------+---------+
#|    null|    Braga|
#|   Spain|Barcelona|
#|    null|   Arnhem|
#|portugal|  Amadora|
#+--------+---------+

from pyspark.sql.functions import *

df.withColumn("country",coalesce(col("country"),col("city"))).show()
#+--------+---------+
#| country|     city|
#+--------+---------+
#|   Braga|    Braga|
#|   Spain|Barcelona|
#|  Arnhem|   Arnhem|
#|portugal|  Amadora|
#+--------+---------+

使用spark中的
合并
函数从列列表中获取第一个
非空值

示例:

df.show()
#+--------+---------+
#| country|     city|
#+--------+---------+
#|    null|    Braga|
#|   Spain|Barcelona|
#|    null|   Arnhem|
#|portugal|  Amadora|
#+--------+---------+

from pyspark.sql.functions import *

df.withColumn("country",coalesce(col("country"),col("city"))).show()
#+--------+---------+
#| country|     city|
#+--------+---------+
#|   Braga|    Braga|
#|   Spain|Barcelona|
#|  Arnhem|   Arnhem|
#|portugal|  Amadora|
#+--------+---------+

您可以使用窗口函数来实现这一点

从pyspark.sql导入函数为F,窗口
df.withColumn(
“国家”,
聚结(
F.col(“国家”),
F.first(“国家”)。以上(窗口、分区(“城市”)。订购人(“城市”)),
),
).show()

您可以使用窗口功能来实现这一点

从pyspark.sql导入函数为F,窗口
df.withColumn(
“国家”,
聚结(
F.col(“国家”),
F.first(“国家”)。以上(窗口、分区(“城市”)。订购人(“城市”)),
),
).show()

@Alexandrosgiannakis它真的有效吗?你想用城市的名字来填写这个国家?比如城市=布拉加和国家=布拉加
?不是葡萄牙?哦,天哪。你是对的。这只是城市的名字。真的很抱歉@它真的有效吗?你想用城市的名字来填写这个国家?比如城市=布拉加和国家=布拉加
?不是葡萄牙?哦,天哪。你是对的。这只是城市的名字。真的很抱歉!!