【问题标题】:How to exclude elements contained in another column - Pyspark DataFrame如何排除另一列中包含的元素 - Pyspark DataFrame
【发布时间】:2022-01-14 16:20:57
【问题描述】:

假设您有一个 pyspark 数据框 df,其中包含三列:A, B, C。我想取数据框中 B 的值在 C 中不存在的行。

例子:

A B C
a 1 2
b 2 4
c 3 6
d 4 8 

会回来

A B C
a 1 2
c 3 6

我尝试了什么

df.filter(~df.B.isin(df.C))

我也尝试将 B 的值列成一个列表,但这需要很长时间。

【问题讨论】:

  • @Chris loc 在 pyspark 中不起作用,您正在考虑 pandas

标签: python dataframe pyspark


【解决方案1】:

问题在于您如何使用isin。无论好坏,isin 实际上无法将另一个 pyspark Column 对象作为输入处理,它需要一个实际的集合。因此,您可以做的一件事是将您的列转换为列表:

col_values = df.select("C").rdd.flatMap(lambda x: x).collect()
df.filter(~df.B.isin(col_values))

虽然性能方面,这显然并不理想,因为您的主节点现在负责操作您刚刚加载到内存中的单个列的全部内容。您可以使用左反连接来获得所需的结果,而无需将任何内容转换为列表并失去 Spark 分布式计算的效率:

df0 = df[["C"]].withColumnRenamed("C", "B")
df.join(df0, "B", "leftanti").show()

感谢 cmets 中的 Emma 的贡献。

【讨论】:

  • 应该是left_anti 而不是leftsemi
  • 就这样,你想通了 :D 现在更新我的答案。
  • left_anti 就像一个魅力,谢谢!
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 2012-05-01
  • 2023-02-01
  • 1970-01-01
  • 2022-01-03
  • 2018-04-19
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多