Как использовать оператор в столбце со значением и списком из столбцов?

Обратите внимание, что я не спрашиваю, как сделать то, что может array_contains, но мне любопытно, есть ли способ использовать in или isin для того же. Думаю, выход есть, но думать ясно уже поздно.


Есть ли способ использовать предикат in SQL или оператор столбца isin со списком для сопоставления, который поступает со значениями из столбца?

Скажем, у меня есть следующий набор данных nums:

scala> nums.printSchema
root
 |-- id: integer (nullable = false)
 |-- nums: array (nullable = true)
 |    |-- element: integer (containsNull = false)

scala> nums.show
+---+---------+
| id|     nums|
+---+---------+
|  1|[1, 2, 3]|
+---+---------+

Я хотел бы написать запрос для использования предиката in / isin с использованием столбцов id и nums.

nums.where($"id" isin $"nums") не работает из-за несоответствия типов:

scala> nums.where($"id" isin $"nums").show
org.apache.spark.sql.AnalysisException: cannot resolve '(`id` IN (`nums`))' due to data type mismatch: Arguments must be same type but were: int != array<int>;;
'Filter id#18 IN (nums#19)
+- AnalysisBarrier
      +- Project [_1#15 AS id#18, _2#16 AS nums#19]
         +- LocalRelation [_1#15, _2#16]

Подходит ли предикат filter вашим потребностям? databricks.com/blog/2017/05/24/…

Dan W 01.05.2018 22:54

Доступны ли они в последней версии Spark SQL 2.3? Если нет, то они мне не подходят.

Jacek Laskowski 01.05.2018 23:13

Пожалуйста, подумайте еще раз, когда вы голосуете, чтобы закрыть вопрос, предлагая использовать array_contains. Мне интересно, какие функции in / isin отсутствуют, чтобы соответствовать array_contains, если таковые имеются.

Jacek Laskowski 01.05.2018 23:20

Если вы хотите снова открыть это, я хочу выступить против (вы все равно можете сделать это в одиночку, верно?), Но я не думаю, что здесь действительно есть вопрос, поэтому я не буду делать это сам. Вы уже проанализировали API и пришли к выводу, что он не поддерживается. Лично я не припомню ни одной системы, поддерживающей IN collection (у Oracle есть x member of array, у PostgreSQL есть x = ANY(array)), так что, возможно, это вопрос соответствия стандарту или просто мы делаем это так, потому что все делают.

zero323 01.05.2018 23:40

Согласно документации expression that is evaluated to true if the value of this expression is contained by the **evaluated** values of the arguments. В исходном коде вы можете ясно видеть, что isin - это метод varargs, а параметр преобразован либо в List, либо в Set. Поэтому без сбора не обойтись.

addmeaning 02.05.2018 19:47

Спасибо @ user6910411 @addmeaning за вашу помощь. Я наконец «обнаружил», что даже nums.filter("id in (select nums from numsT)").show не принесет никакой пользы, и я поправился. Простите за шум.

Jacek Laskowski 02.05.2018 21:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
703
0

Другие вопросы по теме