【问题标题】:How can I match two rows in a pyspark dataframe when the value in a column in a row matches the value in another column in another row?当一行中的列中的值与另一行中另一列中的值匹配时,如何匹配 pyspark 数据框中的两行?
【发布时间】:2019-08-13 19:40:08
【问题描述】:

我有一个如下所示的 spark 数据框。如果在 col1 的其他行中找到 col2 中的值,我想在新列的列表中获取 col3 的值。而且我宁愿不使用自加入。

输入:

col1    col2    col3  
A       B       1  
B       C       2
B       A       3 

输出:

col1    col2    col3    col4
A       B       1       [2,3]  
B       C       2       []
B       A       3       [1] 

【问题讨论】:

  • 为什么要避免使用join?这是执行此操作的惯用方式。请支持加入是expensive operation 的声明。相对于什么来说贵?
  • 相对于窗口操作。
  • @ pault... 我试图对 spark 数据框做同样的事情,但自加入在 col2&col1 上不起作用.. donnw 发生了什么。你能建议一下吗?谢谢

标签: python dataframe apache-spark pyspark


【解决方案1】:

您需要使用groupby 创建映射,然后使用merge

mapper = df.groupby('col1', as_index=False).agg({'col3': list}).rename(columns={'col3':'col4', 'col1': 'col2'})
df.merge(mapper, on='col2', how='left')

输出:

  col1  col2    col3    col4
0   A   B       1      [2, 3]
1   B   C       2      NaN
2   B   A       3      [1]

【讨论】:

  • 谢谢。合并本质上是加入。不幸的是,加入是一项昂贵的操作。是否有具有相同功能的窗口操作?
  • 你能定义“贵”吗?
  • 加入比窗口操作需要更多的处理能力。一个 slef-join 可能是这里的答案,但我想知道在这个问题上是否可以避免加入。
  • 我不认为“加入比窗口操作需要更多的处理能力”在这种情况下是正确的,因为窗口是任意的。该窗口没有固定顺序或模式。最好在mapper@AhmadrezaJavanmardi 之后合并
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多