如何删除'复制'加入相同的pyspark数据帧的行?

时间:2018-02-18 09:11:47

标签: python-2.7 pyspark apache-spark-sql spark-dataframe pyspark-sql

我需要显示由三列组成的数据框。其中两个显示在共同电影中工作的人的姓名(由第三个代码上的代码表示)

这是我的查询代码:

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 个答案:

答案 0 :(得分:1)

这是使用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|
#+-------------+----------------+----------------+

答案 1 :(得分:0)

您可以创建一个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()