получить последнее значение столбца из таблицы куста условно для других столбцов - PullRequest
0 голосов
/ 17 мая 2018

У меня есть таблица Hive 'Orders' с четырьмя столбцами (id String, name String, Order String, ts String). Пример данных таблицы приведен ниже.

-------------------------------------------
id  name    order               ts
------------------------------------------- 
1   abc     completed       2018-04-12 08:15:26     
2   def     received        2018-04-15 06:20:17
3   ghi     processed       2018-04-16 11:36:56
4   jkl     received        2018-04-05 12:23:34
3   ghi     received        2018-03-23 16:43:46
1   abc     processed       2018-03-17 18:39:22
1   abc     received        2018-02-25 20:07:56

Столбец Заказ имеет три полученных состояния -> обработано -> выполнено. Есть много заказов на одно имя, и у каждого есть эти три этапа. Мне нужно последнее значение порядка для заданных «id» и «name». Это может показаться вам вопросом новичка, но я застрял с этим.

Я пытался писать запросы, как показано ниже, но они не работают, и я не мог использовать функцию max напрямую в столбце 'ts', как в формате String. Пожалуйста, посоветуйте лучший метод. Заранее спасибо.

Запросы, которые я пробовал

SELECT
ORDER
FROM Orders
WHERE id = '1'
    AND name = 'ghi'
    AND ts = (
        SELECT max(unix_timestamp(ts, 'yyyy-MM-dd HH:mm:SS'))
        FROM Orders
        )

Ошибка при компиляции оператора: FAILED: ParseException строка 2: 0 не может распознать ввод вблизи 'select' 'max' '(' в спецификации выражения

SELECT
ORDER
FROM Orders
WHERE id = '1'
    AND name = 'ghi'
    AND max(unix_timestamp(ts, 'yyyy-MM-dd HH:mm:SS'))

Ошибка при компиляции оператора: СБОЙ: SemanticException [Ошибка 10128]: строка 1:93 Еще не поддерживается место для UDAF 'max'

select o.order  from Orders o
inner join ( 
    select id, name, order, max(ts) as ts
    from Orders
    group by id, name, order
) ord on d.id = ord.id and o.name = ord.name and o.ts = ord.ts where o.id = '1' and o.name = 'abc'

Этот запрос был выполнен, но выходные данные представляют собой не один последний этап заказа, а каждый этап заказа с соответствующей последней отметкой времени.

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Для данного заказа вы хотите одну строку.Следовательно, вы можете использовать order by и limit:

SELECT o.*
FROM Orders o
WHERE id = 1 AND  -- presumably id is a number
     name = 'ghi'
ORDER BY ts DESC
LIMIT 1;

. Это также должно иметь наилучшую производительность.

0 голосов
/ 17 мая 2018

Вы можете использовать аналитическую функцию RANK для решения вашей проблемы, как показано ниже:

select id,name,order,ts
from (select id,name,order,ts,rank() over(partition by id,name order by ts) r from orders)k
where r = 1
and id = '1'
and name = 'ghi'

Если вы хотите получить самую последнюю запись для всех идентификаторов и имен, вам не нужно передаватьзначения для "ID" и "NAME" вы легко получите желаемый результат.

Всего наилучшего !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...