Развертывание списка в Hive SQL для выявления пробелов

У меня есть столбец с именем 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"]

заранее спасибо

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

leftjoin 15.03.2019 17:38

Извините, leftjoin, я имел в виду строки. Я не знаю, почему я сказал столбцы. Вы можете предположить, что таблица myHiveTable содержит всего 2 столбца Id String, part_no_list array<string>. Обычно пустой столбец, пустые столбцы и несколько других значений в столбце должны быть заполнены дефисом «-», чтобы пользовательский интерфейс мог фильтровать их по умолчанию. Глядя на код, похоже, что это работа. Пробовал первый sql, записей с пробелами не появилось. Но я получил еще один sql, второй, который показывает 42 строки с пустым part_no_list. Это на клаудере. Я использую Hive для запуска sql (не impala). Является ли первый улей sql правильным

user1509593 15.03.2019 19:39

Укажите, что содержит part_no_list

leftjoin 15.03.2019 19:43

Я хочу идентифицировать строку 5

user1509593 15.03.2019 19:47

Какой у вас 5-й ряд??? Оно не может быть просто пустым. это всегда должен быть массив. Массив из одного пустого элемента выглядит как [] не просто пустой

leftjoin 15.03.2019 19:52

о это. Я не могу просмотреть эту запись, и я думал, что это должно быть похоже. Дай мне поискать. Спасибо

user1509593 15.03.2019 19:55

Есть ли способ легко вытащить этот ряд? Покажет ли 1-й sql в моем исходном сообщении эту строку?

user1509593 15.03.2019 19:59

Давайте продолжить обсуждение в чате.

user1509593 15.03.2019 20:02
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
8
1 881
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы проверить, пуст ли элемент разнесенного массива, используйте это:

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 15.03.2019 21:18

@user1509593 user1509593 Только вы точно знаете, в чем именно дело, потому что у меня нет ваших данных и я не могу воспроизвести.

leftjoin 15.03.2019 21:27

Спасибо оставил присоединиться. Моей целью было сделать его полезным для других. Я помещаю имя таблицы во внутренний выбор

user1509593 15.03.2019 23:34

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