如何从列表列创建组合的pysparkDataframe

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

我现在有一个PyparkDataframe,如下所示:

  1. +--------------------+
  2. | items|
  3. +--------------------+
  4. | [1, 2, 3, 4]|
  5. | [1, 5, 7]|
  6. | [9, 10]|
  7. | ...|

我的目标是转换这个Dataframe(或创建一个新的Dataframe),以便新数据是表中项目的两个长度组合。
我知道 itertools.combinations 可以创建列表的组合,但我正在寻找一种方法来有效地对大量数据执行此操作,但我无法找出如何将其与pyspark集成。
示例结果:

  1. +-------------+-------------+
  2. | item1| item2|
  3. +-------------+-------------+
  4. | 1| 2|
  5. | 2| 1|
  6. | 1| 3|
  7. | 3| 1|
  8. | 1| 4|
  9. | 4| 1|
  10. | 2| 3|
  11. | 3| 2|
  12. | 2| 4|
  13. | 4| 2|
  14. | 3| 4|
  15. | 4| 3|
  16. | 1| 5|
  17. | 5| 1|
  18. | 1| 7|
  19. | 7| 1|
  20. | 5| 7|
  21. | 7| 5|
  22. | 9| 10|
  23. | 10| 9|
  24. | ...|
hpxqektj

hpxqektj1#

你可以用 itertools.combinations 使用自定义项:

  1. import itertools
  2. from pyspark.sql import functions as F
  3. combinations_udf = F.udf(
  4. lambda x: list(itertools.combinations(x, 2)),
  5. "array<struct<item1:int,item2:int>>"
  6. )
  7. df1 = df.withColumn("items", F.explode(combinations_udf(F.col("items")))) \
  8. .selectExpr("items.*")
  9. df1.show()
  10. # +-----+-----+
  11. # |item1|item2|
  12. # +-----+-----+
  13. # |1 |2 |
  14. # |1 |3 |
  15. # |1 |4 |
  16. # |2 |3 |
  17. # |2 |4 |
  18. # |3 |4 |
  19. # |1 |5 |
  20. # |1 |7 |
  21. # |5 |7 |
  22. # |9 |10 |
  23. # +-----+-----+
展开查看全部

相关问题