искровое скала декартово произведение каждого элемента в колонне - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть датафрейм, который выглядит следующим образом:

df:

col1    col2
a       [p1,p2,p3]
b       [p1,p4]

Требуемый вывод:

df_out:

col1 col2 col3
p1   p2   a
p1   p3   a
p2   p3   a
p1   p4   b

Я провел небольшое исследование и считаю, что преобразование df в rddи тогда flatMap с cartesian продуктом идеально подходят для этой проблемы.Однако я не мог объединить их вместе.

Спасибо,

1 Ответ

0 голосов
/ 24 сентября 2018

Похоже, вы пытаетесь сделать комбинацию, а не декартову.Пожалуйста, проверьте мое понимание.

Это в PySpark, но единственная вещь на Python - это UDF, остальное - просто операции DataFrame.

процесс -

  1. Создание фрейма данных
  2. определение UDF для получения всех пар комбинаций без учета порядка
  3. использование UDF для преобразования массива в массив парструктур, по одному на каждый элемент комбинации
  4. разбить результаты, чтобы получить строки пары структур
  5. выделить каждую структуру и исходный столбец 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|
+----+----+----+
...