【问题标题】:Check if array columns have overlapping element检查数组列是否有重叠元素
【发布时间】:2021-06-08 04:00:50
【问题描述】:

我有一个包含两个数组列的数据框,如下所示:

Arrayed_Column_1
[{"ID":222222,"No":2},{"ID":333333,"No":1}]
[{"ID":555555,"No":2},{"ID":333333,"No":1},{"ID":333333,"No":3}]
[{"ID":222222,"No":2},{"ID":555555,"No":1},{"ID":333333,"No":3}]
[{"ID":555555,"No":2},{"ID":333333,"No":1}]

Arrayed_Column_2
[{"ID":333333,"No":2},{"ID":666663,"No":1}]
[{"ID":333333,"No":2},{"ID":666666,"No":1},{"ID":333333,"No":3}]
[{"ID":222222,"No":2},{"ID":555555,"No":1},{"ID":333333,"No":3}]
[{"ID":555333,"No":2},{"ID":66666,"No":1}]

如何在不使用explode 函数的情况下过滤column_2 中同时存在ID 和column_1 的No 组合的那些行?

我知道array_contains 函数,但它只检查特定值。

【问题讨论】:

  • Arrayed_Column_1的类型是什么?地图数组?
  • 这是一个带有结构化元素的数组

标签: arrays dataframe apache-spark pyspark apache-spark-sql


【解决方案1】:

尝试使用arrays_overlap

import pyspark.sql.functions as F

col1 = F.expr('transform(column_1, x -> struct(x.ID as ID, x.No as No, x.Value2 as Value2))')
col2 = F.expr('transform(column_2, x -> struct(x.ID as ID, x.No as No, x.Value2 as Value2))')

df2 = df.filter(F.arrays_overlap(col1, col2))

另一种方法是查看array_intersect

df2 = df.filter(F.size(F.array_intersect(col1, col2)) != 0)

【讨论】:

  • 似乎这工作正常,但我收到数据类型不匹配通知:Column_1 包含 Column_2 中不存在的附加元素
  • 它是一个数组结构。我已经看到不匹配的来源。 column1 包含一个布尔值(我们实际上不需要这个比较): Column_1:array element:struct ID:long No:long Value1:boolean Value2:string Column_2:array element:struct ID:long No:long Value2:字符串
  • 尝试编辑后的答案,确保第 1 列和第 2 列具有相同的结构。
【解决方案2】:

你也可以使用exists + array_contains:

df1 = df.filter(
    "exists(Arrayed_Column_1, x -> array_contains(Arrayed_Column_2, x))"
)

【讨论】:

  • 感谢您的建议。它确实有效,但仍然需要对数组结构进行一些调整。在另一个答案的帮助下,我设法解决了这个问题。也感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多