在Pyspark中使用Windows分区时排除列中的空值

时间:2018-06-10 04:21:40

标签: apache-spark pyspark

我在pyspark中有一个如下所示的数据框。

+-----+---+---+----+
|tests|val|asd|cnty|
+-----+---+---+----+
|test1|  Y|  1|null|
|test2|  N|  2|  UK|
| null|  Y|  1|  UK|
|test1|  N|  2|null|
| null|  N|  3|null|
|test3|  N|  4| AUS|
|test4|  Y|  5|null|
+-----+---+---+----+

我希望在任何给定val tests val Y时更新val's列,然后该特定tests的所有Y都应更新为{{ 1}}。如果不是那么他们有什么价值。我想排除tests列中包含null值的记录。

我在下面做了

from pyspark.sql import Window
import pyspark.sql.functions as f


df1 = df.select('tests', f.max('val').over(Window.partitionBy('tests')).alias('val'), 'asd', 'cnty')

我得到的结果如下

+-----+---+---+----+
|tests|val|asd|cnty|
+-----+---+---+----+
|test1|  Y|  1|null|
|test1|  Y|  2|null|
|test2|  N|  2|  UK|
|test3|  N|  4| AUS|
|test4|  Y|  5|null|
| null|  Y|  1|  UK|
| null|  Y|  3|null|
+-----+---+---+----+

我希望结果如下所示

+-----+---+---+----+
|tests|val|asd|cnty|
+-----+---+---+----+
|test1|  Y|  1|null|
|test1|  Y|  2|null|
|test2|  N|  2|  UK|
|test3|  N|  4| AUS|
|test4|  Y|  5|null|
| null|  Y|  1|  UK|
| null|  N|  3|null|
+-----+---+---+----+

1 个答案:

答案 0 :(得分:2)

您需要的只是额外的when条件检查

from pyspark.sql import Window
import pyspark.sql.functions as f

df1 = df.select('tests', f.when((f.isnull(f.col('tests'))) | (f.col('tests') == 'null'), f.col('val')).otherwise(f.max('val').over(Window.partitionBy('tests'))).alias('val'), 'asd', 'cnty')

会给你

+-----+---+---+----+
|tests|val|asd|cnty|
+-----+---+---+----+
|test4|  Y|  5|null|
|test3|  N|  4| AUS|
|test1|  Y|  1|null|
|test1|  Y|  2|null|
|test2|  N|  2|  UK|
| null|  Y|  1|  UK|
| null|  N|  3|null|
+-----+---+---+----+

我希望答案很有帮助