HiveQL - first_value нескольких столбцов над окном - PullRequest
0 голосов
/ 10 марта 2020

Я хочу получить первую и последнюю строку поверх окна в HiveQL.
Я знаю, что есть несколько способов сделать это:

  1. Использовать FIRST_VALUE и LAST_VALUE на интересующих меня столбцах.
    • SELECT customer,
      FIRST_VALUE(product) over (W),
      FIRST_VALUE(time) over (W),
      LAST_VALUE(product) over (W),
      LAST_VALUE(time) over (W)
      FROM table
      WINDOW W AS (PARTITION BY customer ORDER BY COST)
      
  2. Рассчитать ROW_NUMBER () каждого row и используйте предложение where для row_number = 1.
WITH table_wRN AS  
(
    SELECT *,
    row_number() over (partition by customer order by cost ASC) rn_B,
    row_number() over (partition by customer order by cost DESC) rn_E
    FROM table 
),
table_first_last AS
(
SELECT *
FROM table_wRN 
WHERE (rn_E=1 OR rn_B=1)
)

SELECT table_first.customer,
table_first.product, table_first.time,
table_last.product, table_last.time
FROM table_first_last as table_first WHERE table_first_last.rn_B=1
JOIN table_first_last as table_last WHERE table_first_last.rn_E=1
ON table_first.customer = table_last.customer

Мои вопросы:

  1. Кто-нибудь знает, какой из этих двух более эффективен?
    • Интуитивно, я думаю, что первый должен быть быстрее, потому что нет необходимости в подзапросе или CTE.
    • Экспериментально я чувствую, что второе быстрее, но это может быть потому, что я запускаю first_value для нескольких столбцов.
  2. Есть ли способ применить first_value и получить несколько столбцов в одном кадре.
    • Я стремлюсь уменьшить количество раз, когда оконная работа выполняется / оценивается (что-то вроде кэширования окна)
    • Пример псевдокода:
      • FIRST_VALUE(product,time) OVER (W) AS product_first, time_first

Спасибо!

1 Ответ

1 голос
/ 10 марта 2020

Я почти уверен, что первый будет более эффективным. Я имею в виду две оконные функции против двух оконных функций, фильтрации и двух объединений?

После умножения количества столбцов может возникнуть проблема, которая будет быстрее. Тем не менее, посмотрите на план выполнения. Я ожидаю, что все оконные функции, использующие одну и ту же спецификацию оконного фрейма, будут использовать одну и ту же обработку "windows", с простыми настройками для каждого значения.

Hive не очень хорошо поддерживает сложные типы данных, такие как строки и массивы. В таких базах данных достаточно просто указать сложный тип.

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