如何从Spark SQL Join选择顶部行

时间:2019-07-02 10:07:48

标签: apache-spark-sql

我有2个这样的数据框。 df1

+----+-------------+
|colA|colB         |
+----+-------------+
|   1|   "someval" | 
|   2|   "someval2"|  
|   3|   "someval3"|

df2

+----+-------------+
|colA|colC         |
+----+-------------+
|   1|   "someval" | 
|   1|   "someval2"|  
|   2|   "someval3"|

如果我通过colA进行内部连接df1和df2,我会得到这个。

+----+-------------+----------+
|colA|colB         |colC      |
+----+-------------+----------+
|   1|   "someval" |"someval" |
|   1|   "someval" |"someval2"| 
|   2|   "someval2"|"someval3"|

但是我只想要colA的不同行(因此,获取colA的第一行就足够了)

+----+-------------+----------+
|colA|colB         |colC      |
+----+-------------+----------+
|   1|   "someval" |"someval" |
|   2|   "someval2"|"someval3"|

2 个答案:

答案 0 :(得分:1)

尝试一下。

distinct_df = df2.dropDuplicates(['colA']) 

加入数据框

inner_join_df = df1.join(distinct_df, df1.colA == distinct_df.colA)
inner_join_df.show()

我已经使用熊猫加入了数据框:

import pandas as pd
data1 =[[1,'someval'],[2,'someval2'],[3,'someval3']]
data2 =[[1,'someval'],[1,'someval2'],[2,'someval3']]

df1=pd.DataFrame(data1,columns=['colA','colB'])
df2=pd.DataFrame(data2,columns=['colA','colC'])

unique_df=df2.drop_duplicates('colA')

joindf = pd.merge(df1,unique_df,on='colA',how='inner')
print(joindf )

答案 1 :(得分:0)

使用窗口函数对列A的值与使用其他列相同的行进行排序。在第二步中,仅过滤函数结果为1的行

sqlContext.sql(""" select colA,colB,colC from ( SELECT *,row_number() over (PARTITION by colA order by colB,colC) as rn from df_p )x where rn=1 """ ).show(60)