HiveQL: выберите значения из двух столбцов на основе соответствующих значений в двух других столбцах - PullRequest
0 голосов
/ 10 мая 2018

Выберите значения из столбца A на основе соответствующих значений в столбце Y и значений из столбца B на основе соответствующих значений в столбце Z.Смысл в том, чтобы сравнить значения aid и bid, где каждое из них было выбрано в соответствии с различными критериями / столбцами.Ниже приведен иллюстративный пример:

У меня есть таблица со строками, подобными следующей:

id   n       aid             bid             prob1
a    3       155321341       155303877       0.03014809320294261
a    4       155303877       155321341       0.05024180995725168

Я хотел бы сохранить aid, связанный с самым высоким n, и сохранитьbid с самым высоким prob1.Короче говоря, я хотел бы что-то вроде следующего:

id   n       aid             bid             prob1
a    4       155303877       155321341       0.05024180995725168

Я пытался:

SELECT DISTINCT 
    id, 
    MAX(n)     OVER (PARTITION BY aid) AS max_n_atthisaid, 
    aid, bid, 
    MAX(prob1) OVER (PARTITION BY bid) AS max_prob1_atthisbid
FROM table.a;

Но, возможно, по причинам, очевидным для других, это не сработало.

- ОБНОВЛЕНИЕ: я попробовал приведенный ниже код Гордона, и он отлично работал (однако следует отметить, что более старые версии Hive могут не поддерживать DISTINCT с «оконными» функциями, поэтому он может не работать для других):

SELECT DISTINCT id,
       FIRST_VALUE(aid) OVER (PARTITION BY id ORDER BY n DESC) AS max_n_atthisaid, 
       FIRST_VALUE(bid) OVER (PARTITION BY id ORDER BY prob1 DESC) AS max_prob1_atthisbid
FROM table.a;

Однако я также хочу увидеть MAX(n) и MAX(prob1), поэтому я попытался:

SELECT DISTINCT id,
   FIRST_VALUE(aid) OVER (PARTITION BY id ORDER BY n DESC) AS max_n_atthisaid, 
   MAX(n) AS max_n,
   FIRST_VALUE(bid) OVER (PARTITION BY id ORDER BY prob1 DESC) AS max_prob1_atthisbid,
   MAX(prob1) AS max_prob1
FROM table.a;

Но получил следующую ошибку:

FAILED: SemanticException [Error 10128]: Line 4:7 Not yet supported place for UDAF 'MAX'

Это потому, что мне не разрешено использовать MAX с оконной функцией или по какой-то другой причине, с которой я незнаком?

1 Ответ

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

Используйте first_value() вместо:

SELECT DISTINCT id,
       FIRST_VALUE(aid) OVER (PARTITION BY id ORDER BY n DESC) AS max_n_atthisaid, 
       FIRST_VALUE(bid) OVER (PARTITION BY id ORDER BY prob1 DESC) AS max_prob1_atthisbid
FROM table.a;

EDIT:

Возможно, вам потребуется использовать подзапрос:

SELECT DISTINCT *
FROM (SELECT id,
             FIRST_VALUE(aid) OVER (PARTITION BY id ORDER BY n DESC) AS max_n_atthisaid, 
             FIRST_VALUE(bid) OVER (PARTITION BY id ORDER BY prob1 DESC) AS max_prob1_atthisbid
      FROM table.a
     ) a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...