代码之家  ›  专栏  ›  技术社区  ›  silviacamplani

如何删除加入同一pyspark数据帧的“重复”行?

  •  3
  • silviacamplani  · 技术社区  · 6 年前

    我需要显示由三列组成的数据框。其中两个显示了在一部普通电影中工作过的人的名字(由第三个代码上的代码表示)

    以下是我的查询代码:

    name_data_df3 = movie_join_oscar_join_name.filter('Nazione in ("USA", "England", "France", "Canada", "Italy", "Austria")').select('knownForTitle','person').distinct()
    art_pre_edge_data1 = name_data_df3.select(col('person').alias('artist1'), 'knownForTitle', )
    art_pre_edge_data2 = art_pre_edge_data1.select(col('artista').alias('artist2'), col('knownForTitle').alias('knownForTitle2'))
    art_edge_data = art_pre_edge_data1.join(art_pre_edge_data2, (art_pre_edge_data1.knownForTitle==art_pre_edge_data2.knownForTitle2) & (art_pre_edge_data1.artista!=art_pre_edge_data2.artista2))
    art_edge_data = art_edge_data.drop(art_pre_edge_data2.knownForTitle2)
    art_edge_data.select('*').show()
    

    结果如下:

    +-----------------+-------------+-----------------+
    |          artist1|knownForTitle|         artist2|
    +-----------------+-------------+-----------------+
    |   Robert Redford|    tt0070735|  George Roy Hill|
    |  George Roy Hill|    tt0070735|   Robert Redford|
    | Lionel Barrymore|    tt0022958|    Wallace Beery|
    | Lionel Barrymore|    tt0022958|    Joan Crawford|
    |    Wallace Beery|    tt0022958| Lionel Barrymore|
    |    Wallace Beery|    tt0022958|    Joan Crawford|
    |    Joan Crawford|    tt0022958| Lionel Barrymore|
    |    Joan Crawford|    tt0022958|    Wallace Beery|
    

    如何删除重复项?

    2 回复  |  直到 6 年前
        1
  •  1
  •   pault Tanjin    6 年前

    这里有一种使用DataFrame函数的方法。按字母顺序比较两列并赋值,以便 artist1 将始终按字典排序 artist2 . 然后选择不同的行。

    import pyspark.sql.functions as f
    
    df.select(
        'knownForTitle',
        f.when(f.col('artist1') < f.col('artist2'), f.col('artist1')).otherwise(f.col('artist2')).alias('artist1'),
        f.when(f.col('artist1') < f.col('artist2'), f.col('artist2')).otherwise(f.col('artist1')).alias('artist2'),
    ).distinct().show()
    #+-------------+----------------+----------------+
    #|knownForTitle|         artist1|         artist2|
    #+-------------+----------------+----------------+
    #|    tt0070735| George Roy Hill|  Robert Redford|
    #|    tt0022958|   Joan Crawford|Lionel Barrymore|
    #|    tt0022958|   Joan Crawford|   Wallace Beery|
    #|    tt0022958|Lionel Barrymore|   Wallace Beery|
    #+-------------+----------------+----------------+
    
        2
  •  0
  •   pauli    6 年前

    您可以创建一个udf并执行如下操作

    func_udf = f.udf(lambda x,y: sorted([x,y]), t.ArrayType(t.StringType()))
    
    df2 = df.withColumn('artists', func_udf('artist1','artist2')).select(['artists',
                                 'KnownForTitle']).distinct().show()