通过仅从两列中获取唯一值对pyspark dataframe的列进行分组

通过仅从两列中获取唯一值对pyspark dataframe的列进行分组,pyspark,pyspark-sql,pyspark-dataframes,Pyspark,Pyspark Sql,Pyspark Dataframes,我希望根据pyspark dataframe的两列中的唯一值对列进行分组。数据帧的输出应该是这样的,一旦某个值用于groupby,并且如果它出现在另一列中,那么它就不应该重复 |------------------|-------------------| | fruit | fruits | |------------------|-------------------| | apple |

我希望根据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('fruit').agg(collect_list('fruits').alias('values'))
我从上面的查询中得到以下输出

       |------------------|--------------------------------|
       |   fruit          |     values                     | 
       |------------------|--------------------------------|
       |  apple           | ['banana','mango','pineapple'] |
       |  banana          | ['apple']                      |
       |  orange          | ['guava']                      |
       |  mango           | ['apple']                      |
       |------------------|--------------------------------|
但我想要以下输出

       |------------------|--------------------------------|
       |   fruit          |     values                     | 
       |------------------|--------------------------------|
       |  apple           | ['banana','mango','pineapple'] |
       |  orange          | ['guava']                      |
       |------------------|--------------------------------|

这看起来像是连接组件的问题。有几种方法可以做到这一点

1。图形框架

您可以使用GraphFrames包。数据帧的每一行都定义了一条边,您可以使用
df
作为边创建一个图形,使用所有不同结果的数据帧作为顶点。然后调用
connectedComponents
方法。然后可以操纵输出以获得所需内容

2。只需Pypark

第二种方法有点老套。为每行创建一个“哈希”,如

hashed_df=df.withColumn('hash',F.sort_数组(F.array(F.col('fruit'),F.col('fruits')))
删除该列的所有非不同行

distinct_df=hash_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')。别名('group'))

如果Pyspark抱怨,您可能需要使用
F.concat_ws
对哈希进行“字符串化”,但想法是一样的。

这实际上取决于数据帧的顺序,对吗?如果香蕉在苹果之前加工,那么香蕉仍然存在,我的假设正确吗?如果一旦对值进行分组,那么根据分组数据,就不应该重复任何值,即如果香蕉首先出现,那么它应该是[香蕉|['苹果','芒果','菠萝'],然后是[橙色|['番石榴']outputspark数据帧没有保证的顺序,这对结果有关系吗?不,对结果没有关系