HiveQL-窗口上多列的first_value

问题描述 投票:0回答:1

我正在寻找HiveQL中窗口的第一行和最后一行。我知道有几种方法可以做到这一点:

    在我感兴趣的列上<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)
    计算每行的
  1. ROW_NUMBER()
  2. ,并对row_number = 1使用where子句。
  3. 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
    我的问题:

      有人知道这两个中哪个更有效吗?
      • 直觉上,我认为第一个应该更快,因为不需要子查询或CTE。
    1. 实验上,我觉得第二个更快,但这可能是因为我在许多列上运行first_value。
  4. 是否有一种方法可以应用first_value并一次获取多个列。
    • 我希望减少开窗/评估窗口的次数(类似于缓存窗口)
  5. 伪代码示例:
    • FIRST_VALUE(product,time) OVER (W) AS product_first, time_first
  6. 谢谢!
  7. sql hadoop hiveql
    1个回答
    0
    投票
    我几乎可以肯定,第一个会更有效率。我的意思是两个窗口函数与两个窗口函数,过滤和两个联接?

    一旦您将列数相乘,则可能会出现一个更快的问题。就是说,看看执行计划。我希望所有使用相同窗口框架规范的窗口函数都将使用相同的“窗口”处理,并对每个值进行微调。

    Hive对复杂数据类型(例如字符串和数组)没有很好的支持。在这样做的数据库中,提供一个复杂的类型很容易。

    © www.soinside.com 2019 - 2024. All rights reserved.