Spark SQL условно выбирает столбец на основе типа данных столбца

У меня есть столбец, который иногда представляет собой строку, а иногда массив строк с одним элементом. К сожалению, у меня нет возможности изменить это поведение, поэтому он всегда имеет один тип данных.

Когда столбец представляет собой массив, мне нужно выбрать его первый элемент, когда он содержит строку, мне нужно выбрать другой столбец.

Когда я делаю:

SELECT IFNULL(`myColumn`[0],`myOtherColumn`) FROM myTable

Если myColumn является строкой, она выдает:

org.apache.spark.sql.AnalysisException: невозможно извлечь значение из myColumn#691: нужен тип структуры, но получена строка

Я проверил java_method , но на самом деле он работает только со статическими методами из java-библиотек, поэтому я не могу использовать isArray или какой-либо другой метод экземпляра.

Есть ли способ условно выбрать столбцы на основе типа данных столбца?

Столбец может иметь только один тип данных. Не могли бы вы показать схему таблицы?

mck 26.12.2020 13:47

Да, но столбец динамически генерируется кодом библиотеки (spark-solr), что придает ему соответствующий тип в зависимости от других вещей. Поэтому, когда я запускаю sql с разными данными, столбец иногда представляет собой массив, иногда строку.

uylmz 26.12.2020 13:50

Я не понимаю. У вас есть несколько таблиц с разными типами столбцов или у вас есть одна таблица со столбцом, имеющим несколько типов? Последнее кажется мне невозможным. В любом случае, вы могли бы сделать describe table myTable?

mck 26.12.2020 13:54

Библиотека spark-solr используется для загрузки данных из Solr в Spark. Пользователь указывает некоторые параметры, что превращается в запрос Solr, результат которого загружается в myTable с помощью spark-solr. Поле myColumn представляет собой массив в некоторых коллекциях Solr, строку в других, поэтому в зависимости от того, что указал пользователь, каждая результирующая таблица myTable имеет разные схемы, но мой SQL должен работать в обоих условиях. Надеюсь, я смог уточнить. Да, у меня есть 2 разные таблицы с разными типами столбцов, но может быть только 1 sql, который должен работать для обоих.

uylmz 26.12.2020 14:21

Разработка программного обеспечения для таких странных ситуаций означает --> вернуться к исходному коду и очистить его.

thebluephantom 26.12.2020 15:30
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
247
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу найти способ поставить проверку типа столбца в случае, когда, но вот хак, который может сработать:

select
    case when (substring(cast(myColumn as string), 1, 1) = '[') and 
              (substring(cast(myColumn as string), -1, 1) = ']')
         then split(trim(both '[]' from cast(myColumn as string)), ',')[0]
         else myOtherColumn
         end
from myTable;

Конечно, это может не сработать, если строка начинается с [ или заканчивается на ]. Если бы вы могли использовать pyspark/scala, вы могли бы сделать это более надежным способом, проверив типы столбцов.

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