Сгруппировать столбец фрейма данных Pyspark, взяв только уникальные значения из двух столбцов.
Я хочу сгруппировать столбец на основе уникальных значений из двух столбцов pyspark dataframe. Выходные данные кадра данных должны быть такими, чтобы однажды какое-то значение использовалось для groupby, и если оно присутствует в другом столбце, оно не должно повторяться.
|------------------|-------------------|
| fruit | fruits |
|------------------|-------------------|
| apple | banana |
| banana | apple |
| apple | mango |
| orange | guava |
| apple | pineapple |
| mango | apple |
| banana | mango |
| banana | pineapple |
| -------------------------------------|
Я попытался сгруппировать с помощью одного столбца, и он должен быть изменен или какая-то другая логика должна потребоваться.
DF9=final_main.groupBy('плод'). AGG (collect_list('плоды'). псевдоним ('ценность'))
Я получаю следующий вывод из запроса выше;
|------------------|--------------------------------|
| fruit | values |
|------------------|--------------------------------|
| apple | ['banana','mango','pineapple'] |
| banana | ['apple'] |
| orange | ['guava'] |
| mango | ['apple'] |
|------------------|--------------------------------|
Но я хочу следующий вывод;
|------------------|--------------------------------|
| fruit | values |
|------------------|--------------------------------|
| apple | ['banana','mango','pineapple'] |
| orange | ['guava'] |
|------------------|--------------------------------|
1 ответ
Это похоже на проблему со связанными компонентами. Есть несколько способов сделать это.
1. GraphFrames
Вы можете использовать пакет GraphFrames. Каждая строка вашего фрейма данных определяет ребро, и вы можете просто создать график, используя df
как ребра и дата-каркас всех различных плодов как вершин. Затем позвоните connectedComponents
метод. Затем вы можете манипулировать выводом, чтобы получить то, что вы хотите.
2. Просто Писпарк
Второй метод немного взломан. Создайте "хэш" для каждой строки, например
hashed_df = df.withColumn('hash', F.sort_array(F.array(F.col('fruit'), F.col('fruits'))))
Удалить все непонятные строки для этого столбца
distinct_df = hashed_df.dropDuplicates(['hash'])
Разделить предметы снова
revert_df = distinct_df.withColumn('fruit', F.col('hash')[0]) \
.withColumn('fruits', F.col('hash')[1])
Группировать по первому столбцу
grouped_df = revert_df.groupBy('fruit').agg(F.collect_list('fruits').alias('group'))
Вам может понадобиться "зашить" ваш хеш, используяF.concat_ws
если Pyspark жалуется, но идея та же.