我在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|
+-----+---+---+----+
答案 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|
+-----+---+---+----+
我希望答案很有帮助