pyspark генерирует все комбинации уникальных значений - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь сгенерировать все комбинации уникальных значений в моем искровом фрейме данных.Решение, которое мне приходит на ум, требует использования файлов данных itertools.product и pandas, и поэтому оно недостаточно эффективно.Вот мой код:

all_date = [ i.Date for i in df.select("Date").distinct().collect()]
all_stores_id = [i.ID for i in fd.select("ID").distinct().collect()]
all_category = [i.CATEGORY for i in fd.select("CATEGORY").distinct().collect()]
combined = [all_date, all_stores_id, all_category]
all_combination_pdf= pd.DataFrame(columns = ['Date', 'ID', 'CATEGORY'], data=list(itertools.product(*combined)))
# convert pandas dataframe to spark
all_combination_df = sqlContext.createDataFrame(all_combination_pdf)
joined =  all_combination_df.join(df,["Date","ID","CATEGORY"],how="left")

Есть ли способ изменить этот код на более исконный?

====== РЕДАКТИРОВАТЬ ======

Я также пытался реализовать такие функции с помощью функции crossJoin .Вот код:

test_df = ((df.select('Date').distinct()).crossJoin(df.select('ID').distinct())).crossJoin(df.select('CATEGORY').distinct())
test_df.show(10)

, который по неизвестной причине вызывает следующее исключение:

An error occurred while calling o305.showString.
: java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.lang.Integer.valueOf(Integer.java:832)

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете сгенерировать фрейм данных с этим.Он просто создает фрейм данных с уникальными значениями каждого столбца и выполняет перекрестное соединение (декартово произведение) с другими.

((df.select('Date').distinct()).crossJoin(df.select('ID').distinct())).crossJoin(df.select('CATEGORY').distinct())

Он может быть помещен в цикл for с некоторымиработать, чтобы автоматизировать его для других фреймов данных.

Надеюсь, это поможет

...