У меня есть столбец с именем part_nos_list как массив<\строка> в таблице куста. По-видимому, этот столбец пуст, и я хочу обновить его с помощью «-». Код делает это, но 42 строки в группе имеют пробелы. Я пытался проверить отдельные записи, но безуспешно. Вот улей sql. Что-то не так в этом sql?
SELECT order_id, exploded_part_nos
FROM sales.order_detail LATERAL VIEW explode(part_no_list) part_nos AS exploded_part_nos where sale_type in ('POS', 'OTC' , 'CCC') and exploded_part_nos = ''
Однако эта группа по sql показывает 42 как пробелы
select * from (SELECT explo,count(*) as uni_explo_cnt
FROM sales.order_detail
LATERAL VIEW explode(split(concat_ws("##", part_no_list),'##')) yy AS explo where sale_type in ('POS', 'OTC' , 'CCC') group by explo order by explo asc) DD
Вот как выглядит таблица улья
Id Part_no_list
1 ["OTC","POS","CCC"]
2 ["OTC","POS"]
4 NULL
5
6 ["-"]
7 ["OTC","POS","CCC"]
заранее спасибо
Извините, leftjoin, я имел в виду строки. Я не знаю, почему я сказал столбцы. Вы можете предположить, что таблица myHiveTable содержит всего 2 столбца Id String, part_no_list array<string>. Обычно пустой столбец, пустые столбцы и несколько других значений в столбце должны быть заполнены дефисом «-», чтобы пользовательский интерфейс мог фильтровать их по умолчанию. Глядя на код, похоже, что это работа. Пробовал первый sql, записей с пробелами не появилось. Но я получил еще один sql, второй, который показывает 42 строки с пустым part_no_list. Это на клаудере. Я использую Hive для запуска sql (не impala). Является ли первый улей sql правильным
Укажите, что содержит part_no_list
Я хочу идентифицировать строку 5
Какой у вас 5-й ряд??? Оно не может быть просто пустым. это всегда должен быть массив. Массив из одного пустого элемента выглядит как [] не просто пустой
о это. Я не могу просмотреть эту запись, и я думал, что это должно быть похоже. Дай мне поискать. Спасибо
Есть ли способ легко вытащить этот ряд? Покажет ли 1-й sql в моем исходном сообщении эту строку?
Давайте продолжить обсуждение в чате.



Чтобы проверить, пуст ли элемент разнесенного массива, используйте это:
select * from(
select explode( array("OTC","POS","CCC","")) as explo
) s where explo=''
Результат — одна пустая строка.
Если вы хотите идентифицировать массив, содержащий пустой элемент, используйте array_contains:
select * from(
select array("OTC","POS","CCC","") as a
) s where array_contains(a,'')
Результат:
["OTC","POS","CCC",""]
Если вы хотите найти массив, содержащий только один элемент - используйте пустую строку size(array)=1 или array_contains(array,'')
Но есть и такая вещь, как пустой массив. Он отображается так же, как массив, содержащий пустой элемент, но это не то же самое.
А чтобы найти пустой массив, используйте size()=0
Пример:
select * from(
select array() as a
) s where size(a)=0
Возврат []
Запустите все эти запросы к вашим данным, и вы станете просветленными. Я думаю, что это пустые массивы, а не пустой элемент в вашем случае
Пустой массив не равен NULL, потому что он по-прежнему является объектом массива нулевого размера:
select * from(
select array() as a
) s where a is null
Не возвращает строк
Лучше запрашивать массив только без взрыва и использовать array_contains и size для поиска пустых массивов и пустых элементов. Используйте БОКОВОЙ ВИД ВНЕШНИЙ для создания строк, даже если БОКОВОЙ ВИД обычно не создает строку. БОКОВОЙ ВИД без слова OUTER работает как ВНУТРЕННЕЕ СОЕДИНЕНИЕ, см. документы о ВИД СБОКУ ВНЕШНИЙ
Спасибо, что нашли время, чтобы помочь в написании запроса. Это выглядит хорошо, и я собираюсь принять ответ. Я предполагаю, что имя таблицы из order_detail входит во внутренний выбор. Это правильно ? Если это так, не могли бы вы добавить это, чтобы я мог принять ответ.
@user1509593 user1509593 Только вы точно знаете, в чем именно дело, потому что у меня нет ваших данных и я не могу воспроизвести.
Спасибо оставил присоединиться. Моей целью было сделать его полезным для других. Я помещаю имя таблицы во внутренний выбор
Пожалуйста, предоставьте несколько примеров данных. Так же не понятно где 42 столбца