【发布时间】:2020-05-14 18:11:57
【问题描述】:
我正在尝试根据包含空值的列在分区内进行排序。
这个DataFrame可以这样创建:
df = spark.createDataFrame(
[("2019-01-01", 5),
("2019-01-01", 20),
("2019-01-01", 10),
("2019-01-03", 1),
("2019-01-03", None),
("2019-01-03", None),
("2019-01-03", 2),
("2019-01-05", 10)],
("Date", "value")
)
看起来像:
+----------+-----+
| Date|value|
+----------+-----+
|2019-01-01| 5|
|2019-01-01| 20|
|2019-01-01| 10|
|2019-01-03| 1|
|2019-01-03| null|
|2019-01-03| null|
|2019-01-03| 2|
|2019-01-05| 10|
+----------+-----+
现在我想对每个日期的每个值从 1 到 N 进行排名。我尝试使用以下代码:
w = Window.partitionBy("date").orderBy("value")
df = df.withColumn("rank", F.dense_rank().over(w))
但是,这显然将所有 null 值列为 1,而不管一列中有多少 null 值:
+----------+-----+----+
| Date|value|rank|
+----------+-----+----+
|2019-01-03| null| 1|
|2019-01-03| null| 1|
|2019-01-03| 1| 2|
|2019-01-03| 2| 3|
|2019-01-05| 10| 1|
|2019-01-01| 5| 1|
|2019-01-01| 10| 2|
|2019-01-01| 20| 3|
+----------+-----+----+
如何更改dense_rank() 的行为,使其在排名时将null 的值保持在null,而不是给这些值任意排名1?
【问题讨论】:
-
@Menmo Van Dijk 下面的答案对你有用吗?