Присоединяйтесь на пересечении массивов - PullRequest
0 голосов
/ 16 апреля 2020

Здравствуйте, я хочу присоединиться к пересечению массива. Я нашел функцию arrays_overlap на spark - но пока не могу заставить ее работать. Я также попытался написать пользовательский UDF безрезультатно. Там я получаю сообщение об ошибке «Требуются атрибуты более чем одного ребенка». Я понятия не имею, что это значит усложнить отладку. Я что-то упустил по этому поводу? Использование Hive / 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

Что мне здесь не хватает?

1 Ответ

1 голос
/ 16 апреля 2020

С 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|
#+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...