Python 如何从列表列创建组合的Pyspark数据帧
我目前有一个pyspark数据帧,如下所示:Python 如何从列表列创建组合的Pyspark数据帧,python,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我目前有一个pyspark数据帧,如下所示: +--------------------+ | items| +--------------------+ | [1, 2, 3, 4]| | [1, 5, 7]| | [9, 10]| | ...| 我的目标是转换这个数据帧(或创建一个新的数据帧),以便新数据是表中项目的两个长度组合 我知道,itertools.combinat
+--------------------+
| items|
+--------------------+
| [1, 2, 3, 4]|
| [1, 5, 7]|
| [9, 10]|
| ...|
我的目标是转换这个数据帧(或创建一个新的数据帧),以便新数据是表中项目的两个长度组合
我知道,itertools.combinations
可以创建列表的组合,但我正在寻找一种方法来高效地对大量数据执行此操作,我不知道如何将其与PySpark集成
示例结果:
+-------------+-------------+
| item1| item2|
+-------------+-------------+
| 1| 2|
| 2| 1|
| 1| 3|
| 3| 1|
| 1| 4|
| 4| 1|
| 2| 3|
| 3| 2|
| 2| 4|
| 4| 2|
| 3| 4|
| 4| 3|
| 1| 5|
| 5| 1|
| 1| 7|
| 7| 1|
| 5| 7|
| 7| 5|
| 9| 10|
| 10| 9|
| ...|
您可以将
itertools.组合与自定义项一起使用:
import itertools
from pyspark.sql import functions as F
combinations_udf = F.udf(
lambda x: list(itertools.combinations(x, 2)),
"array<struct<item1:int,item2:int>>"
)
df1 = df.withColumn("items", F.explode(combinations_udf(F.col("items")))) \
.selectExpr("items.*")
df1.show()
#+-----+-----+
#|item1|item2|
#+-----+-----+
#|1 |2 |
#|1 |3 |
#|1 |4 |
#|2 |3 |
#|2 |4 |
#|3 |4 |
#|1 |5 |
#|1 |7 |
#|5 |7 |
#|9 |10 |
#+-----+-----+
导入itertools
从pyspark.sql导入函数为F
组合_udf=F.udf(
lambda x:list(itertools.组合(x,2)),
“数组”
)
df1=df.withColumn(“项目”),F.explode(组合_-udf(F.col(“项目”))\
.selectExpr(“项目。*”)
df1.show()
#+-----+-----+
#|项目1 |项目2|
#+-----+-----+
#|1 |2 |
#|1 |3 |
#|1 |4 |
#|2 |3 |
#|2 |4 |
#|3 |4 |
#|1 |5 |
#|1 |7 |
#|5 |7 |
#|9 |10 |
#+-----+-----+