python—如何在pyspark中应用条件,使其仅在其他人删除null时保持null

dddzy1tm  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(429)

条件:
如果id的得分为“高”或“中”->则删除“无”
如果id只有score none->只保留none
输入:
IDSCOREAAAHIGHAAAMIDAANONEBBBNONE公司
期望输出:
idscoreaaahighaaamidbbbnone公司
我在pyspark中写if条件有困难。或者有没有其他方法来解决这个问题?
谢谢你的帮助。非常感谢!

izj3ouym

izj3ouym1#

你可以数数 Score Windows上方 ID ,然后打开过滤器 Score 不为null或计数为0:

  1. from pyspark.sql import Window
  2. from pyspark.sql import functions as F
  3. df1 = df.withColumn(
  4. "count_scores",
  5. F.count("Score").over(Window.partitionBy("ID"))
  6. ).where("Score IS NOT NULL OR count_scores = 0")\
  7. .drop("count_scores")
  8. df1.show()
  9. # +---+-----+
  10. # | ID|Score|
  11. # +---+-----+
  12. # |BBB| null|
  13. # |AAA| High|
  14. # |AAA| Mid|
  15. # +---+-----+
展开查看全部
hgqdbh6s

hgqdbh6s2#

您可以添加是否所有分数都为空的标志,并过滤分数不为空或标志为真(所有分数都为空)时的行:

  1. from pyspark.sql import functions as F, Window
  2. df2 = df.withColumn(
  3. 'flag',
  4. F.min(F.col('Score').isNull()).over(Window.partitionBy('ID'))
  5. ).filter('flag or Score is not null').drop('flag')
  6. df2.show()
  7. +---+-----+
  8. | ID|Score|
  9. +---+-----+
  10. |BBB| null|
  11. |AAA| High|
  12. |AAA| Mid|
  13. +---+-----+

相关问题