删除低于阈值的特性,但保留sparkDataframe中每个组的第一个和最后一个条目

m1m5dgzv  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(295)

我有一个像这样的sparkDataframe

  1. +----+---------+------------------+
  2. |user|timestamp| distance|
  3. +----+---------+------------------+
  4. | A| 1| 0.0|
  5. | A| 2| 36.35191443247001|
  6. | A| 3|62.550475311048984|
  7. | A| 4|16.847739134139704|
  8. | A| 5|17.952563555225684|
  9. | A| 6|102.41261599024176|
  10. | A| 7| 95.82221771177366|
  11. | A| 8|104.63394547709433|
  12. | A| 9|26.506336419934364|
  13. | A| 10|157.00039533864333|
  14. | A| 11| 20.15671111217189|
  15. | A| 12|21.870381223509487|
  16. | A| 13|18.137363209583356|
  17. | A| 14|129.28661000398125|
  18. | A| 15|163.74993239641088|
  19. | A| 16| 267.4166754520851|
  20. | B| 17| 0.0|
  21. | B| 18|101.20396648774368|
  22. | B| 19|24.029134761698852|
  23. | B| 20| 97.04635170538656|
  24. | B| 21|13.411774011828113|
  25. | B| 22|14.631128012534537|
  26. | B| 23| 75.87504358867835|
  27. | B| 24|19.864402941978202|
  28. | B| 25|14.797121212341262|
  29. | B| 26| 10.53739042907292|
  30. | B| 27| 73.658902219453|
  31. | B| 28|252.58741644688948|
  32. +----+---------+------------------+

我想在spark中编写一个函数,删除所有距离低于某个值的特征,但同时保留每个特征的第一个和最后一个特征 user 组,而不考虑距离阈值。在spark中实现这一点的最佳方法是什么?

rqenqsqc

rqenqsqc1#

您可以指定行号来指示某一行是否是该用户的第一行/最后一行,并根据行号和距离进行筛选:

  1. from pyspark.sql import functions as F, Window
  2. df2 = df.withColumn(
  3. 'first',
  4. F.row_number().over(Window.partitionBy('user').orderBy('timestamp'))
  5. ).withColumn(
  6. 'last',
  7. F.row_number().over(Window.partitionBy('user').orderBy(F.desc('timestamp')))
  8. ).filter('first = 1 or last = 1 or distance > 50').drop('first', 'last')
  9. df2.show()
  10. +----+---------+------------------+
  11. |user|timestamp| distance|
  12. +----+---------+------------------+
  13. | B| 28|252.58741644688948|
  14. | B| 27| 73.658902219453|
  15. | B| 23| 75.87504358867835|
  16. | B| 20| 97.04635170538656|
  17. | B| 18|101.20396648774368|
  18. | B| 17| 0.0|
  19. | A| 16| 267.4166754520851|
  20. | A| 15|163.74993239641088|
  21. | A| 14|129.28661000398125|
  22. | A| 10|157.00039533864333|
  23. | A| 8|104.63394547709433|
  24. | A| 7| 95.82221771177366|
  25. | A| 6|102.41261599024176|
  26. | A| 3|62.550475311048984|
  27. | A| 1| 0.0|
  28. +----+---------+------------------+
展开查看全部

相关问题