У меня есть столбец, который иногда представляет собой строку, а иногда массив строк с одним элементом. К сожалению, у меня нет возможности изменить это поведение, поэтому он всегда имеет один тип данных.
Когда столбец представляет собой массив, мне нужно выбрать его первый элемент, когда он содержит строку, мне нужно выбрать другой столбец.
Когда я делаю:
SELECT IFNULL(`myColumn`[0],`myOtherColumn`) FROM myTable
Если myColumn является строкой, она выдает:
org.apache.spark.sql.AnalysisException: невозможно извлечь значение из myColumn#691: нужен тип структуры, но получена строка
Я проверил java_method , но на самом деле он работает только со статическими методами из java-библиотек, поэтому я не могу использовать isArray или какой-либо другой метод экземпляра.
Есть ли способ условно выбрать столбцы на основе типа данных столбца?
Да, но столбец динамически генерируется кодом библиотеки (spark-solr), что придает ему соответствующий тип в зависимости от других вещей. Поэтому, когда я запускаю sql с разными данными, столбец иногда представляет собой массив, иногда строку.
Я не понимаю. У вас есть несколько таблиц с разными типами столбцов или у вас есть одна таблица со столбцом, имеющим несколько типов? Последнее кажется мне невозможным. В любом случае, вы могли бы сделать describe table myTable
?
Библиотека spark-solr используется для загрузки данных из Solr в Spark. Пользователь указывает некоторые параметры, что превращается в запрос Solr, результат которого загружается в myTable с помощью spark-solr. Поле myColumn представляет собой массив в некоторых коллекциях Solr, строку в других, поэтому в зависимости от того, что указал пользователь, каждая результирующая таблица myTable имеет разные схемы, но мой SQL должен работать в обоих условиях. Надеюсь, я смог уточнить. Да, у меня есть 2 разные таблицы с разными типами столбцов, но может быть только 1 sql, который должен работать для обоих.
Разработка программного обеспечения для таких странных ситуаций означает --> вернуться к исходному коду и очистить его.
Я не могу найти способ поставить проверку типа столбца в случае, когда, но вот хак, который может сработать:
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, вы могли бы сделать это более надежным способом, проверив типы столбцов.
Столбец может иметь только один тип данных. Не могли бы вы показать схему таблицы?