Похоже, вы пытаетесь сделать комбинацию, а не декартову.Пожалуйста, проверьте мое понимание.
Это в PySpark, но единственная вещь на Python - это UDF, остальное - просто операции DataFrame.
процесс -
- Создание фрейма данных
- определение UDF для получения всех пар комбинаций без учета порядка
- использование UDF для преобразования массива в массив парструктур, по одному на каждый элемент комбинации
- разбить результаты, чтобы получить строки пары структур
- выделить каждую структуру и исходный столбец 1 в столбцы желаемых результатов
from itertools import combinations
from pyspark.sql import functions as F
df = spark.createDataFrame([
("a", ["p1", "p2", "p3"]),
("b", ["p1", "p4"])
],
["col1", "col2"]
)
# define and register udf that takes an array and returns an array of struct of two strings
@udf("array<struct<_1: string, _2: string>>")
def combinations_list(x):
return combinations(x, 2)
resultDf = df.select("col1", F.explode(combinations_list(df.col2)).alias("combos"))
resultDf.selectExpr("combos._1 as col1", "combos._2 as col2", "col1 as col3").show()
Результат:
+----+----+----+
|col1|col2|col3|
+----+----+----+
| p1| p2| a|
| p1| p3| a|
| p2| p3| a|
| p1| p4| b|
+----+----+----+