首页 > 解决方案 > 加入数组交点

问题描述

您好,我想加入阵列交叉点。我在 spark 上找到了一个 arrays_overlap 函数——但我似乎无法让它工作。我也尝试编写自定义 UDF 无济于事。我收到的错误消息是“需要多个孩子的属性”。我不知道这意味着什么使它难以调试。我错过了一些基本的东西吗?使用蜂巢/pyspark

示例查询:

select
a.id
from tbl a
JOIN tbl_b b
ON arrays_overlap(a.my_arr, b.my_arr) = TRUE

def _arrays_overlap(a,b):
    for item in a:
        if item in b:
            return True
    return False

spark.udf.register(
    "_arrays_overlap",
    _arrays_overlap,
    BooleanType()
)


select
a.id
from tbl a
JOIN tbl_b b
ON _arrays_overlap(a.my_arr, b.my_arr) = TRUE

我在这里想念什么?

标签: pysparkhive

解决方案


来自Spark-2.4

我们可以使用array_intersect带有大小的函数来仅连接行大小!= 0。

  • (或)arrays_overlap并加入布尔值TRUE

Example:

df=spark.createDataFrame([(1,[1,2,3]),(2,[4,5])],["id","my_arr"])
df1=spark.createDataFrame([(1,[2,3]),(2,[8,9])],["id","my_arr"])
df.createOrReplaceTempView("tbl")
df1.createOrReplaceTempView("tbl_b")

spark.sql("select a.id from tbl a join tbl_b b on arrays_overlap(a.my_arr,b.my_arr) = TRUE").show()

spark.sql("select a.id from tbl a join tbl_b b on SIZE(array_intersect(a.my_arr,b.my_arr)) != 0").show()

#+---+
#| id|
#+---+
#|  1|
#+---+

推荐阅读