我需要显示由三列组成的数据框。其中两个显示在共同电影中工作的人的姓名(由第三个代码上的代码表示)
这是我的查询代码:
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|
如何删除重复项?
答案 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()