【问题标题】:How to select top row from spark sql join如何从 spark sql join 中选择第一行
【发布时间】:2019-07-03 02:50:25
【问题描述】:

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

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

df2

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

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

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

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

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

【问题讨论】:

  • 在 df2.select('colA').distinct() 下面给出的答案中,将不起作用,因为我需要显示所有 3 个列。我尝试了 dropDuplicates 函数(我不知道)并且它有效。所以如果您可以编辑答案以仅使用 dropDuplicates ,那么我将接受答案

标签: apache-spark-sql


【解决方案1】:

试试这个。

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

加入您的数据框

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

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

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 )

【讨论】:

    【解决方案2】:

    使用窗口函数对具有相同 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)

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2011-11-12
      • 2012-09-13
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多